我的程序员修炼日记

Java浮点类型精度丢失问题

2019-10-17  本文已影响0人  一岁一枯荣啊

一、问题

public class TsDom {
    public static void main(String[] args) {
        double dou1 = 0.1;
        double dou2 = 0.2;
        System.out.println(dou1 + dou2);
        //结果为0.30000000000000004
    }
}

二、分析我们把十进制的0.3转为二进制

小数类型转化为二进制方法: 小数乘以2得到b,取b的整数位,如果b为1.0结束计算得到结果。

结果为 0.0110011001100110011001100………..

十进制转二进制,有些十进制数是无法使用一个有限的二进制数来表示。所以造成运算丢失精度

三、解决(BigDecimal)

public class TsDom {

    public static void main(String[] args) {
        double dou1 = 0.1;
        double dou2 = 0.2;
        System.out.println(dou1 + dou2);
        //结果为0.30000000000000004
        //BigDecimal
        BigDecimal bigDecimal1 = new BigDecimal(Double.toString(dou1));
        BigDecimal bigDecimal2 = new BigDecimal(Double.toString(dou2));
        System.out.println(bigDecimal1.add(bigDecimal2).doubleValue());
        //0.3
    }

}
上一篇下一篇

猜你喜欢

热点阅读