使用双循环。四舍五入可能存在问题

时间:2011-03-29 18:07:59

标签: java rounding

我对今天看到的FOR循环有一个小问题。它看起来像这样:

for (double i = 0.0; i < 1.0; i += 0.1) {  
    for (double j = i; j < 1.0; j += 0.1) {  
        double k = i + j;  
         if ((k % 1) == 0) {  
            System.out.println(i + " + " + j + " = " + k);  
        }  
    }  
}

它应该输出0到1之间的两个数字之和(递增0.1),它们等于整数。但是,由于某种原因,它没有显示0.1 + 0.9 = 1.0的总和。我的猜测可能是因为双格式数字的不正确表示(即0.3 + 0.1不是0.4,而是像0,399999999)。

任何人都可以确认这是真正的问题,并建议如何纠正它?任何帮助都非常赞赏!

4 个答案:

答案 0 :(得分:5)

为什么不使用int s - 从0开始到10,步骤为1?然后if (k % 10) == 0

答案 1 :(得分:3)

当你做这样的事情时你想使用BigDecimal,以避免浮点类型的舍入问题

答案 2 :(得分:0)

您可以尝试打印该号码并验证您的怀疑。如果您绝对必须处理double个数字,则可以选择查看目标值的增量是否足够小。

另一方面,如果您知道您的步数始终为0.1,为什么不将所涉及的所有数字乘以10?如果需要,您可以通过除以10来转换为双精度。

答案 3 :(得分:0)

你猜对浮点数的表示是正确的,我只是把你称之为“不正确”的问题。

人类用十进制表示实数,计算机用二进制表示。在绝对值0.4中可能很难以二进制表示,同样0.0101可能很难在基数3中表示。如果要避免舍入问题,则应使用BigDecimal,或者使用整数并将它们视为“十分之一”或百分之一“vs绝对值。这是做货币的一种方法(使用整数或多头和计算美分,使用浮点数或小数计数和计算美元)