概述
当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时,精度丢失或者数据异常,结果有误差,如何解决?
解决方案总结:
- 将结果转换成String类型,再使用BigDecimal(String s)构造方法
- 使用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时精度丢失或数据异常所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复