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

我有一个很烦人的问题,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

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

有任何想法吗?

回答:

没有精确表示为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);

}

以上是 如何在Java中使用float或double来避免浮点精度错误? 的全部内容, 来源链接: utcz.com/qa/408233.html

回到顶部