【发布时间】:2012-05-24 07:01:26
【问题描述】:
可能重复:
Retain precision with Doubles in java
Moving decimal places over in a double
课程不言自明。如果你执行这段代码,double 值似乎有些溢出,但并非所有值都发生这种情况,此外,如果你直接打印数字,输出就可以了。
public class test {
public static void main(String[] args){
for (double f=1.36; f<1.40; f+=0.01) System.out.println(f);
//Prints 1.36
// 1.37
// 1.3800000000000001 ???????
// 1.3900000000000001 ???????
System.out.println(1.36); //Prints 1.36
System.out.println(1.37); //Prints 1.37
System.out.println(1.38); //Prints 1.38
System.out.println(1.39); //Prints 1.39
}
}
有人能解释一下吗?如果这是一个错误,那么在代码中修复它的最佳方法是什么?有什么神奇的解决方法吗?
【问题讨论】:
-
即使是 JEval 也不能正确处理像“1400*0.001”这样的操作(这就是我跟踪错误的方式),因此我不认为投票否定是个愚蠢的问题跨度>
-
@user1352530 从输出完全符合指定的意义上说,它得到了妥善处理(至于否决票,这可能是因为这个问题可能每天被问一次,所以稍微搜索一下你可能会有发现了一些东西,比如我在上面发布的链接,它位于 Java FAQ)。
-
糟糕.. 抱歉,如果是这样。我真的在寻找,但似乎还不够。如果您不知道是错误还是您做得不好并且如果是数字问题,则很难查询该主题,因为我看到 jEval 也失败并且不知道是否有人有耐心去尝试任何像我一样失败的数字,尽管这并不常见(真的 7 年来从未见过)。
-
不是我,但是如果您在这里搜索双精度或浮点数,您会发现很多人提出的问题,他们还发现浮点数不能代表其范围内的每个数字。跨度>