java - 加减 double 会产生奇怪的结果

标签 java double

所以当我在 Java 中使用 Doubles 进行加法或减法时,它会给我带来奇怪的结果。以下是一些:

如果我添加 0.0 + 5.1,它会给我 5.1。没错。

如果我添加 5.1 + 0.1,它会给我 5.199999999999(重复 9 的数量可能会关闭)。错了。

如果我减去 4.8 - 0.4,它会得到 4.39999999999995(同样,重复的 9 可能会关闭)。错了。

起初我以为这只是用十进制值添加 double 的问题,但我错了。以下工作正常:

5.1 + 0.2 = 5.3
5.1 - 0.3 = 4.8

现在,添加的第一个数字是保存为变量的 double ,尽管第二个变量从 JTextField 中获取文本。例如:

//doubleNum = 5.1 RIGHT HERE
//The textfield has only a "0.1" in it.
doubleNum += Double.parseDouble(textField.getText());
//doubleNum = 5.199999999999999

最佳答案

在 Java 中,double 值为 IEEE floating point numbers .除非它们是 2 的幂(或 2 的幂之和,例如 1/8 + 1/4 = 3/8),否则即使它们具有很高的精度,也无法精确表示。一些浮点运算会加重这些 float 中存在的舍入误差。在上述情况下,浮点错误已经严重到足以显示在输出中。

无论是从 JTextField 解析字符串还是指定 double 文字,数字的来源是什么都无关紧要——问题在于继承浮点表示。

解决方法:

  • 如果你知道你只有这么多小数点,那就用整数 算术,然后转换为小数:

    (double) (51 + 1) / 10
    (double) (48 - 4) / 10
    
  • 使用BigDecimal

  • 如果你必须使用 double,你可以减少浮点错误 与 Kahan Summation Algorithm .

关于java - 加减 double 会产生奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15625556/

相关文章:

java - 为基于 testng 的框架进行测试用例清理的最佳方法

java - Android:枚举与静态最终整数?

c++ - 如何在大型 C++ 程序中为所有 double 类型的数字设置小数精度

c - 在 char[] 缓冲区中保存 double 值

Java 字节数组转换问题

java - Java 中的动态泛型类型

android - 如何使用 SharedPreferences 存储 double?

java - 为什么这个数字要向下舍入?

c++ - 使用整数表示和 ULP 的别名正确比较 double

java - Mac 上跨应用程序信息保存在哪里