减法结果不正确:3.999999,而不是4

时间:2014-01-09 20:18:35

标签: java int double rounding

所以我将我的应用程序中的一个错误缩小到java乱搞一个简单的减法计算。我无法弄明白为什么。这是一些代码:

    for (double x = (((double)bdl.length())-1)/10; x > 0; x--) {
            int count;
            System.out.println("x = " + x);
            if (x >= 1) {
                System.out.println("X = " + x + " so count = 20");
                count = (20);
            } else {
                count = (int)(x*20);
                System.out.println("X = " + x + " so count = "+count);
            }
    }

变量bdl只是一个JSONArray,我只关注它的长度。当bdl最初进入时它的长度为15,因此x将等于1.4。第一次通过循环时,第一个println说“X = 1.4 so count = 20”,这是正确的。第二次通过,当x应该= 0.4时,它反而说“X = 0.3999999999999999 so count = 7”。我明白在那个点和时间将(x * 20)转换为int会给我7,但我的问题是为什么x不等于0.4。

2 个答案:

答案 0 :(得分:1)

您使用的是double,这是一个浮点数。这不是为了预先设定,而是为了速度和非精确。相反,您应该使用int,如下所示:

for (int x = ((bdl.length())-1)/10; x > 0; x--) {

这将使您的数字保持准确。

答案 1 :(得分:0)

实际上,你的'x'确实等于0.4,这只是一个精确的问题。
应该以一定的精度执行所有浮点比较操作(在某些实现中为delta或epsilon)。

请参阅this post