java - 如何避免 Java 中的 float 或 double 的浮点精度错误?

标签 java sum floating-accuracy

我有一个非常烦人的问题,即 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 精确表示为 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);
}

在线查看:ideone

关于java - 如何避免 Java 中的 float 或 double 的浮点精度错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5257166/

相关文章:

sql - 在 sqlite 中使用 Case 语句,无法获得我正在寻找的结果

mysql - SQL 之前条目的总和

Golang 浮点运算

c# - 为什么是 float.Epsilon 而不是零?

java - ActionBar 上下文菜单

mysql - 如何获取MySQL行直到某一列的总和超过阈值?

java - 从 Java 应用程序使用 USB 游戏 handle

java - 如何使用java的ResultSet获取mysql的float的精确值

java - 在 Blackberry 10 模拟器上测试黑莓应用程序

java - 部署/发布/调试 Java Web 应用程序的常见做法