0
点赞
收藏
分享

微信扫一扫

BigDecimal处理Double类型精度问题

最近发现工程里出现金额精度问题,记录下使用区别:

    public static void main(String[] args) {
        Double  a = 0.1;
        BigDecimal b = new BigDecimal(a);
        BigDecimal c = BigDecimal.valueOf(a);
        System.out.println("b is :"+b);
        System.out.println("c is :"+c);
    }

b is :0.1000000000000000055511151231257827021181583404541015625

c is :0.1


问题点:new BigDecimal(double val)

这个方法是不可预测的,以 0.1 为例,如 double 类型的值为 0.1,最后不会返回一个值为 0.1 的 BigDecimal,为什么?原因在于 0.1 无法用有限长度的二进制数表示,无法精确地表示为双精度数,最后的结果会是 0.000110011001…。

解决方案:

1、推荐使用 new BigDecimal(String val)

2、直接使用静态方法 BigDecimal.valueOf(double val)


note

可以直接点构造参数进去查看原有的源码注释,这些问题其实之前是已经注释过的

BigDecimal处理Double类型精度问题_解决方案

举报

相关推荐

0 条评论