我已经花了 1.5 个小时来解决面试问题,但在我的 Java 程序中找不到错误。 然后我发现问题是什么,我不明白(不要注意值,还有其他问题,这是关于类型的):
int size=100;
Integer a=12;
if(a >= size/10)...
//didn't work
与
不同if(a >= size*0.1)...
//worked
我知道存在转换,但是,a=12 时,if(a>=size/10) 怎么可能返回 false?
这是为什么?
最佳答案
/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
的倍数和一个 float
或double
能够表示从零到百范围内的任何整数值。
最后/10
并不总是整数除法:如果第一个操作数是浮点(例如 14.0d/10
),编译器会将其转换为浮点除法。
简短版本:
-
int/int
是一个整数除法,向下舍入到最接近的(较低)整数。 -
int*double
是一个双倍乘法,它 - 带有舍入误差 - 产生最接近正确结果(带十进制数字)的浮点值。
关于java - java中number/10和number*0.1的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27680271/