精确运算避免使用float和double
来源:互联网 发布:seo 推广 编辑:程序博客网 时间:2024/03/29 22:15
在《你可能不知道的Java基础知识(一)》中,我提到使用浮点运算要慎重,感觉说的不够透彻,其实float和double类型主要是为科学和工程计算而设计的。他们执行的是二进制浮点运算,由于二进制的局限性,有时候无法得到准确的结果。
例如:System.out.println(2.0-1.1)将输出0.8999999999999999,而不是0.9,当然这在科学计算中无关紧要,通过四舍五入就可以轻松解决问题,但是在禁止出现舍入误差的运算中(比如金融计算)就不适用了。
在二进制中无法精确地表示10的任何负数次方值,比如0.1,这和十进制中无法精确表示1/3一个道理,所以越到像金融货币计算的问题,我们不得不舍弃float和double,而改BigDecimal类。
在《Effective Java》这本书中也提到这个原则,float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用java.math.BigDecimal,而且非要用String来够造BigDecimal不可!在《Effective Java》一书中的例子是用String来够造BigDecimal的,但是书上却没有强调这一点,这也许是一个小小的失误吧。
用BigDecimal解决上述2.0-1.1问题的代码为:
假如不用String来构造BigDecimal问题将依旧:
当然BigDecimal也提供了舍入方法,下面是网上淘来的类,完美的解决了这些问题:
总结一句话:精确运算要用String构造的BigDecimal,不要用float和double!
- 精确运算避免使用float和double
- 天天记录 - Java 精确计算避免使用float和double
- 做精确计算时应避免使用float和double
- 需要精确答案,避免使用float和double
- 表达式之谜2找零时刻(需要精确答案的地方,避免使用float和double;货币运算使用int,long或BigDecimal)
- 如果要求精确的答案,请避免使用float和double
- Effective Java读书笔记--如果想要知道精确的答案,就要避免使用double和float
- 31-如果要求精确的答案,请避免使用float和double
- 48条:如果需要精确的答案,避免使用float和double
- 第48条:如果需要精确的答案,请避免使用float和double
- Java:Effective Java 学习笔记(第48条:如果需要精确的答案,请避免使用float和double)
- double,float浮点型精确运算
- 不要在精确计算中使用float和double类型
- 第48条:如果需要精确的答案,请避免适用float和double
- 精确运算不能用float/double,用什么类型?
- Effective Java(2nd Edition) Item 48 如果需要精确结果,请避免使用float与double(译文)
- [读书笔记][Effective Java]不要在精确计算中使用float和double类型
- 在对于精确计算的要求下请不要使用float和double
- xingjia
- oracle hash join
- (NOT CLEAR)Question 45: Which of the following options are returned by the typeid operator in C++?
- Linux 学习资料
- 有谁可以帮我哈
- 精确运算避免使用float和double
- PHP——update
- 网络书
- poj1635树的最小表示法,用于判断树的同构
- 2010年上海中医药大学人才需求计划
- SQL Server 优化存储过程的七种方法
- Ajax动态树实现
- X.509证书格式。
- ubuntu 删除文件目录 rm rmdir 命令