我对今天看到的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)。
任何人都可以确认这是真正的问题,并建议如何纠正它?任何帮助都非常赞赏!
答案 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绝对值。这是做货币的一种方法(使用整数或多头和计算美分,使用浮点数或小数计数和计算美元)