概述
数值计算,特别是金额的计算,在金融项目中非常常见,平常我们可能会注意,对于除数的操作,可能会留意是否能够整除,是否需要保留几位小数,但是对于常见的加、减、乘我们是否也要注意小数的问题呢?
先看下面的例子:
System.out.println("0.1 + 0.2 = " + (0.1 + 0.2));
System.out.println("1 - 0.8 = " + (1 - 0.8));
System.out.println("1.015 * 100 = " + (1.015 * 100));
System.out.println("123.3 / 100 = " + (123.3 / 100));
执行结果:
0.1 + 0.2 = 0.30000000000000004
1 - 0.8 = 0.19999999999999996
1.015 * 100 = 101.49999999999999
123.3 / 100 = 1.2329999999999999 是不是和我们想的不是很一样?
这时有同学会想到,这种情况要用BigDecimal类来解决
例如:
System.out.println("new BigDecimal(0.1).add(new BigDecimal(0.2)=" + new BigDecimal(0.1).add(new BigDecimal(0.2)));
System.out.println("new BigDecimal(1).subtract(new BigDecimal(0.8))=" + new BigDecimal(1).subtract(new BigDecimal(0.8)));
执行结果:
new BigDecimal(0.1).add(new BigDecimal(0.2)=0.3000000000000000166533453693773481063544750213623046875
new BigDecimal(1).subtract(new BigDecimal(0.8))=0.1999999999999999555910790149937383830547332763671875
怎么还不行?这就需要看源码了
源码如下:如果传入的是小数,则会当做double 类型处理,精度没有限制
public BigDecimal(double val) {
this(val,MathContext.UNLIMITED);
} 所以我们要用它的重载方法,即可解决:
public BigDecimal(String val) {
this(val.toCharArray(), 0, val.length());
}
小数计算修改为下面即可:
System.out.println("new BigDecimal("0.1").add(new BigDecimal("0.2"))=" + new BigDecimal("0.1").add(new BigDecimal("0.2")));
new BigDecimal("0.1").add(new BigDecimal("0.2"))=0.3
|
最后
以上就是害羞毛衣为你收集整理的避坑-数值计算精度的全部内容,希望文章能够帮你解决避坑-数值计算精度所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复