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

时间:2014-12-28 20:23:22

标签: java types

我一直在处理面试问题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,怎么可能?

为什么?

2 个答案:

答案 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}}。

另一方面,它不是浮点数所带来的全部。 floatdouble无法表示每个整数,并在计算后四舍五入。

对于size的给定值,它会产生效果,因为10010的倍数,而floatdouble是能够表示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?");
  }
}

它有效。我不认为这是你真正的问题。可能是你代码的另一部分。