一尘不染

如何在Java中使用float或double来避免浮点精度错误?

java

我有一个很烦人的问题,Java中的浮点数或双精度数很长。基本上的想法是,如果我执行:

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

我了解到,浮动精度误差会不断累积,但是,如何消除这种误差呢?我尝试使用双精度模式将错误减半,但结果仍然相同。

有任何想法吗?


阅读 384

收藏
2020-03-05

共1个答案

一尘不染

没有精确表示为0.1的a floatdouble。由于此表示错误,结果与你期望的结果略有不同。

你可以使用以下两种方法:

  • 使用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);
}
2020-03-05