我是靠谱客的博主 积极向日葵,最近开发中收集的这篇文章主要介绍double转换为BigDecimal时精度丢失或数据异常,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

当double需要转换为BigDecimal时,精度丢失或者数据异常,结果有误差,如何解决?

首先,我需要做的是,经过一堆计算得出的值,通过Bigdecimal保留两位小数,并且第三位小数进行四舍五入。

    BigDecimal fee = new BigDecimal(130000 / 100.0 / 12 * 126000 / 1000000 / 10);
    Double d = 130000 / 100.0 / 12 * 1 * 126000 / 1000000.0 / 10;
    System.out.println(fee.toString()); 
    //输出结果:1.3649999999999999911182158029987476766109466552734375
    System.out.println(d);  
    //输出结果:1.365

为什么不对?这不是我想要的结果。
业务方反馈,结果有0.01的误差,因为当我再给到业务方时,本应是1.365,保留两位小数,第三位四舍五入,结果应该是1.37才对。
但最后给到的结果却是1.36。

问题出在new BigDecimal造成误差
当double需要转换为BigDecimal时,精度丢失或者数据异常,结果有误差,如何解决?

解决方案总结:

  1. 将结果转换成String类型,再使用BigDecimal(String s)构造方法
  2. 使用BigDecimal.valueOf()方法
 System.out.println(new BigDecimal(d.toString()).toString());
 //输出结果:1.365
 BigDecimal t = BigDecimal.valueOf(130000 / 100.0 / 12 * 126000 / 1000000 / 10);
 //输出结果:1.365

关于BigDecimal.valueOf(double d),源码其实也是通过转换为String类型来的:

    public static BigDecimal valueOf(double val) {
        // Reminder: a zero double returns '0.0', so we cannot fastpath
        // to use the constant ZERO.  This might be important enough to
        // justify a factory approach, a cache, or a few private
        // constants, later.
        return new BigDecimal(Double.toString(val));
    }

方案有若干中,这只是我现在着手使用的方法,记录备案。

最后

以上就是积极向日葵为你收集整理的double转换为BigDecimal时精度丢失或数据异常的全部内容,希望文章能够帮你解决double转换为BigDecimal时精度丢失或数据异常所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部