双减法精度问题

2022-09-01 13:13:19

我的同事做了这个实验:

public class DoubleDemo {

      public static void main(String[] args) {
           double a = 1.435;
           double b = 1.43;
           double c = a - b;
           System.out.println(c);
      }
 }

对于这个一级操作,我期望这个输出:

0.005

但出乎意料的是,输出是:

0.0050000000000001155

为什么双精度在如此简单的操作中会失败?如果 double 不是这项工作的数据类型,我应该使用什么?


答案 1

double在内部存储为二进制的分数 - 如1/4 + 1/8 + 1/16 + ...

值 -或值 -- 不能存储为二进制的精确分数,因此不能存储精确值 ,并且减去的值不是很精确。0.0051.435double0.005

如果您关心精确的十进制算术,请使用 。BigDecimal

您可能还会发现本文对阅读很有帮助。


答案 2

双精度和浮点数并不完全是实数

任何范围内都有无限数量的实数,但只有有限数量的位来表示它们!因此,双精度和浮点数预计会出现舍入误差。

您获得的数字是可以在浮点表示中用双精度表示的最接近的数字。

有关更多详细信息,您可能需要阅读本文 [警告:可能是高级别的]。

您可能希望使用 BigDecimal 来获取正好一个十进制数 [但当您尝试获取 ] 时,您将再次遇到舍入错误。1/3


推荐