如何在Java中使用float或double来避免浮点精度错误?
我有一个很烦人的问题,Java中的浮点数或双精度数很长。基本上的想法是,如果我执行:
for ( float value = 0.0f; value < 1.0f; value += 0.1f ) System.out.println( value );
我得到的是:
0.00.1
0.2
0.3
0.4
0.5
0.6
0.70000005
0.8000001
0.9000001
我了解到,浮动精度误差会不断累积,但是,如何消除这种误差呢?我尝试使用双精度模式将错误减半,但结果仍然相同。
有任何想法吗?
回答:
没有精确表示为0.1的a 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);
}
以上是 如何在Java中使用float或double来避免浮点精度错误? 的全部内容, 来源链接: utcz.com/qa/408233.html