《effective java》48—如果需要精确的答案,请避免使用float和double
2018-03-01 12:38
274 查看
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。
比如:
可以看到计算结果并不正确。
解决这个问题的正确办法是使用BigDecimal、int或者long进行货币计算。
举个例子:
你口袋里有1块钱,货架上有价格从1毛、2毛、3毛一直到1块钱的糖果。你打算从标价为1毛的糖果开始买,每种买一颗,一直到不能支付货架上的下一种货物为止,那么可以买多少颗糖果?
方法一:使用BigDecimal
方法二:使用double,会得到错误的结果:
总结:对于任何需要精确答案的计算任务,请不要使用float和double。
如果性能非常关键,并且不介意自己记录十进制小数点,而且所涉及的数值又不大,就可以使用int或者long。
如果数值范围没有超过9位十进制数字,就可以使用int;
如果不超过18位数字,就可以使用long。
如果数值可能超过18位数字,就必须使用BigDecimal。
相关文章推荐
- Effective Java(2nd Edition) Item 48 如果需要精确结果,请避免使用float与double(译文)
- Java:Effective Java 学习笔记(第48条:如果需要精确的答案,请避免使用float和double)
- 第48条:如果需要精确的答案,请避免使用float和double
- 如果需要精确答案,请避免使用float和double
- 第四十八条:如果需要精确的答案,请避免使用float和double
- 第48条:如果需要精确的答案,请避免使用float和double
- 如果要求精确的答案,请避免使用float和double
- 如果要求精确的答案,请避免使用float和double
- Effective Java读书笔记--如果想要知道精确的答案,就要避免使用double和float
- 表达式之谜2找零时刻(需要精确答案的地方,避免使用float和double;货币运算使用int,long或BigDecimal)
- 需要精确答案,避免使用float和double
- 如果要求精确的答案,请避免使用float和double
- 31-如果要求精确的答案,请避免使用float和double
- 天天记录 - Java 精确计算避免使用float和double
- 精确运算避免使用float和double
- [读书笔记][Effective Java]不要在精确计算中使用float和double类型
- 精确运算避免使用float和double
- Effective Java 之-----精确的答案与double&float
- 金额,数值精确推荐BigDecimal,请勿使用double,float