我一直在处理面试问题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,怎么可能?
为什么?
答案 0 :(得分: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
1}}。
另一方面,它不是浮点数所带来的全部。 float
和double
无法表示每个整数,并在计算后四舍五入。
对于size
的给定值,它会产生效果,因为100
是10
的倍数,而float
或double
是能够表示0到100范围内的任何整数值。
最后/10
并不总是整数除法:如果第一个操作数是浮点(例如14.0d/10
),编译器会将其转换为浮点除法
简短版:
int/int
是整数除法,向下舍入到最接近的(较低)整数。int*double
是一个双乘法 - 带有四舍五入的错误 - 导致浮点值,最接近正确的结果(带小数位)。答案 1 :(得分:0)
我刚刚在这里测试过:
public class a {
public static void main(String[] args) {
int size = 100;
int a = 12;
System.out.println((a >= size / 10) ? "OK" : "Failed?");
}
}
它有效。我不认为这是你真正的问题。可能是你代码的另一部分。