float和double类型并不适合用于货币计算,因为要让一个float或者double精确地表示0.1是不可能的。
比如:
可以看到计算结果并不正确。
解决这个问题的正确办法是使用BigDecimal、int或者long进行货币计算。
举个例子:
你口袋里有1块钱,货架上有价格从1毛、2毛、3毛一直到1块钱的糖果。你打算从标价为1毛的糖果开始买,每种买一颗,一直到不能支付货架上的下一种货物为止,那么可以买多少颗糖果?
方法一:使用BigDecimal
方法二:使用double,会得到错误的结果:
总结:对于任何需要精确答案的计算任务,请不要使用float和double。
如果性能非常关键,并且不介意自己记录十进制小数点,而且所涉及的数值又不大,就可以使用int或者long。
如果数值范围没有超过9位十进制数字,就可以使用int;
如果不超过18位数字,就可以使用long。
如果数值可能超过18位数字,就必须使用BigDecimal。