《effective java》48—如果需要精确的答案,请避免使用float和double

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。

posted @ 2018-03-01 12:39  六七十三  阅读(41)  评论(0编辑  收藏  举报