不能使用float、double进行精确计算,因为浮点数本身是不精确的,如以下代码:
double result=1.00d-0.90d;
System.out.println(result);//打印0.09999999999999998
可以使用BigDecimal进行精确计算,BigDecimal可以表示任意精度的数字,如下:
BigDecimal first=BigDecimal.valueOf(1.00d);
BigDecimal second=BigDecimal.valueOf(0.90d);
BigDecimal result=first.subtract(second);
System.out.println(result.doubleValue());//打印0.1
BigDecimal是不可变类,使用此类可能影响性能。因此可以考虑使用int,long进行计算。假设上例仅有两位小数,并且确定计算结果不会超出int类型所能存储的最大数字,那么可把数字放大100倍,作为int类型进行计算
小数计算基本原则如下:
1.优先使用BigDecimal进行小数计算
2.如果需要提高计算性能,可以使用int或long进行计算,但是需要自行处理小数位数,并且int类型不能超过9位小数,long类型不能超过18位小数