1:问题场景:在金额的计算中, 会出现精度丢失的情况。
数字计算时,计算机会将数字转换为最近似的二进制,在进行计算,这就会导致计算结果精度不正确。
例如:0.1+0.2 =0.30000000000000004 。这个问题在众多编程语言中都出现过。
2:解决办法:这个问题在java中是使用java.math.BigDecimal进行计算。
3:常用方法:加减乘除,比较大小,是否为0,保留n为小数,向上向下,四舍五入。
A : 加减乘除
BigDecimal num= new BigDecimal ("10");
num.add(num);
num.subtract(num);
num.multiply(num);
num.divide(num);
B :比较大小,是否为0
num.compareTo(num)==1
这个方法结果有-1 ,0 ,1 分别表示小于,大于,等于
BigDecimal.ZERO 则表示0
C:保留n位小数,向上向下取整,四舍五入,当出现无限循环小数时使用
setScale的第一个参数是小数位数, 这个示例是保留2位小数, 后面是四舍五入规则.
直接移除n位:
num.setScale(n,BigDecimal.ROUND_DOWN)
进位:
num.setScale(n,BigDecimal.ROUND_UP)
四舍五入,5进位
num.setScale(n,BigDecimal.ROUND_HALP_UP)
四舍五入,5舍弃
num.setScale(n,BigDecimal.ROUND_HALP_DOWN)
D:当小数位过长出现科学计算法时,去除末尾0,方法:stripTrailingZeros() 。不显示科学计算法 转换string。
num.stripTrailingZeros().toString()