java中数字/ 10和数字*0.1之间的差异

Ups*_*n42 0 java types

我一直在处理面试问题1.5个小时,但在我的Java程序中找不到错误.然后我发现问题是什么,我不明白(不注意价值观,还有其他人,这是关于类型):

int size=100;
Integer a=12;
if(a >= size/10)...
//didn't work
Run Code Online (Sandbox Code Playgroud)

不同于

if(a >= size*0.1)...
//worked
Run Code Online (Sandbox Code Playgroud)

我知道有一个转换,但是,如果a = 12,if(a> = size/10)是否返回false,怎么可能?

这是为什么?

Wil*_*sem 5

/10整数除法.虽然*0.1第一第一个操作数转换成double并执行浮点乘法.

如果你使用/10,而操作数是14,它1确实会产生,14/10=1.4但是整数除法将其向下舍入.因此29/10=2.

如果您使用*0.1,Java编译器将首先将值转换size为double,14.0然后将其与0.1生成器进行多次转换1.4.

另一方面,浮点数不是全部.float并且double不能表示每个整数,并在计算后舍入.

对于给定的数值size但是,它将导致的效果,因为100是的倍数10和一个floatdouble能够表示的范围从零到百任何整数值的.

最后/10并不总是整数除法:如果第一个操作数是浮点(例如14.0d/10),编译器会将其转换为浮点除法.

精简版:

  • int/int是一个整数除法,向下舍入到最接近的(较低)整数.
  • int*double是一个双乘法 - 用四舍五入的错误 - 得到浮点值,最接近正确的结果(带十进制数字).