在java中,基本所有的数值类型都有相关的算术运算。
比如简单类型:int long float double
以及他们对应的类:Integer Long Float Double
虽然double类型为双精度,但牵扯到金额计算时,精度仍然是欠缺的。
因为,在java里面,只有BigDecimal类的运算是按照十进制计算的,其他都是以二进制来计算的,所以在精度方面的误差可以参考一下代码:
(一)
BigDecimal i = new BigDecimal(456);
System.out.println(i.divide(new BigDecimal("1.35689898564522454587713213213456465"), 20, BigDecimal.ROUND_HALF_UP).toString());
double f = 456;
System.out.println(f/1.35689898564522454587713213213456465);
运算结果:
336.06038830013981370304
336.06038830013983
(二)
BigDecimal i = new BigDecimal(456);
System.out.println(i.multiply(new BigDecimal("1.35689898564322116")).toString());
double f = 456;
System.out.println(f*1.35689898564322116);
运算结果:
618.74593745330884896
618.7459374533089
如果对于大的金额,牵扯到(X100000000000)运算的时候,结果有可能就差上好多了。
所以,这次项目的一大收获就是,在金额方面运算时一定用BigDecimal类。