Advertisement

BigDecimal双/浮点数处理精度丢失问题

阅读量:

一、问题

在最近的过程中使用BigDecimal进行数值加减运算时遇到了一个小问题:当 BigDecimal 操作 double 或 float 数值时会导致精度丢失。

复制代码
    public static void main(String[] args) {
        float d1 = 1.2f;
        float d2 = 2.1f;
        BigDecimal b1 = new BigDecimal(d1);
        BigDecimal b2 = new BigDecimal(d2);
        System.out.println(b1.add(b2));
    }

理想输出结果应为3.3;然而实际运行中得到的结果却是3.2999999523162841796875。若将此数值乘以一百万零一千七百九十五又六十四分之五十一亿七十六……则可能导致公司损失达数千上万元人民币左右;这一误差仅仅是因为计算过程中的精度丢失所致。

我们都知道 Java 的简单类型无法准确处理浮点运算。而 BigDecimal 被设计为专门处理超过 16 位数字的高精度计算。那么在我们刚刚举的例子中为什么会出现精度丢失的问题呢?

下面是BigDecimal的构造方法文档的解释:

public BigDecimal

全部评论 (0)

还没有任何评论哟~