我有一个非常烦人的问题,即 Java 中的 float 或 double 很长。基本上这个想法是,如果我执行:
for ( float value = 0.0f; value < 1.0f; value += 0.1f )
System.out.println( value );
我得到的是:
0.0
0.1
0.2
0.3
0.4
0.5
0.6
0.70000005
0.8000001
0.9000001
我知道有 float 精度误差的累积,但是,如何摆脱这个?我尝试使用 doubles 将错误减半,但结果还是一样。
有什么想法吗?
最佳答案
没有将 0.1 精确表示为 float
或 double
。由于这种表示错误,结果与您的预期略有不同。
您可以使用的几种方法:
- 当使用
double
类型时,只显示你需要的数字。在检查相等性时,无论哪种方式都允许有一个小的容差。 - 或者使用允许您存储要精确表示的数字的类型,例如
BigDecimal
可以精确表示 0.1。
BigDecimal
的示例代码:
BigDecimal step = new BigDecimal("0.1");
for (BigDecimal value = BigDecimal.ZERO;
value.compareTo(BigDecimal.ONE) < 0;
value = value.add(step)) {
System.out.println(value);
}
在线查看:ideone
关于java - 如何避免 Java 中的 float 或 double 的浮点精度错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5257166/