我在面试问题上已经做了1.5小时了,但在我的Java程序中找不到这个bug。然后我发现了问题所在,我不明白(不要注意价值观,还有其他问题,是关于类型的):
int size=100;
Integer a=12;
if(a >= size/10)...
//didn't work是不同于
if(a >= size*0.1)...
//worked我知道有一个转换,但是如果(a>=size/10)返回false,那么使用a=12怎么可能呢?
为什么会这样呢?
发布于 2014-12-28 20:25:30
/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能够表示从0到100之间的任何整数值。
最后,/10并不总是整数除法:如果第一个操作数是浮点数(例如14.0d/10),编译器将把它转换为浮点除法。
简写版:
int/int是一个整数除法,舍入到最近(下)的整数。int*double是一种双乘法,它与舍入误差一起导致浮点值,最接近正确的结果(用十进制数字)。发布于 2014-12-28 20:35:21
我刚在这里测试过:
public class a {
public static void main(String[] args) {
int size = 100;
int a = 12;
System.out.println((a >= size / 10) ? "OK" : "Failed?");
}
}而且起作用了。我不认为这是你真正的问题。可能在代码的另一部分。
https://stackoverflow.com/questions/27680271
复制相似问题