我一直在处理面试问题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,怎么可能?
这是为什么?
/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
是一个双乘法 - 用四舍五入的错误 - 得到浮点值,最接近正确的结果(带十进制数字).