问题提出
float和double并没有提供完全精确的结果。例如下面这段代码
System.out.println(1.03-0.42);
输出结果为:
0.6100000000000001
这并不符合我们的期待,这是由于float或double不可能准确地表示10的任意负数次方。所以float和double类型不适合用于货币计算。
解决方法
- 使用BigDecimal类
BigDecimal a=new BigDecimal("1.03");
BigDecimal b=new BigDecimal("0.42");
System.out.println(a.subtract(b));
输出结果为:
0.61
方法虽好,但是与基本类型相比这样做很不方便,并且速度会变慢。
- 使用int或long
使用int还是long取决于所涉及数值的大小,这时要自己处理十进制小数。比如关于货币计算,如果我们以分为单位而不是以元为点为,就不会出现小数了。
总结
- 精确计算不要使用float或double。
- 若希望系统帮忙处理小数,即不介意不方便和性能上的一些损失,则使用BigDecimal;另外BigDecimal允许你控制舍入;如果数据位数超过18则必须使用BigDecimal。
- 如果性能很关键并且你愿意自行处理小数,并且所涉及数值都不太大,则可以使用int(9位)或long(18位)。