最近工作中正好用到了BigDecimal,在调用setScale方法时出现了一系列问题,所以就把这个类大概研究了一下。
首先,为什么在商业计算中都使用BigDecimal类型而不使用double或者float来计算呢,下面这篇文章说得很好,我就不写了,总之BigDecimal的string类型的构造方法精度比较高,而float或者double都不能满足要求。
BigDecimal a = new BigDecimal(126.123);
System.out.println(a);
BigDecimal b = new BigDecimal("126.123");
System.out.println(b);
a = 126.1230000000000046611603465862572193145751953125
b = 126.123
这是两种构造方法的区别,显而易见,string类型的更为准确。这也解释了为什么下面这种情况会错误:
System.out.println(new BigDecimal(123.120).setScale(4));
然后,在使用setScale方法时要注意,如果方法内不加舍入模式的话,舍入后的精度要大于当前数字的精度,如果小于也可以,但是要保证当前数字中你要舍入的精度后的小数都是0,比如这种:
System.out.println(new BigDecimal("123.120").setScale(2));
总而言之,在不确定的情况下,最好的办法就是加上舍入模式。