浏览 1635 次
锁定老帖子 主题:Effective Java读书笔记5
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-11-15
import java.math.BigDecimal; /** * 8-48 * 如果想要知道精确的答案,就要避免使用double和float 对于金融行业来说,对数据的严整性要求是很高的,不容半点马虎, 那大家都知道再我们的Java语言里面有两个浮点数类型的变量float和double, 可能大家会认为他们的精度对于金融行业这样对数字敏感的行业来说,已经够用了, 但是在开发当中,我们要尽量少使用double和float,因为让他们精确的表达0.1是不可能的。 那我们如何解决这个问题呢, 答案是使用BigDecimal,int或者long进行货币计算。 在这里对大家的忠告是: float和double 类型尤其不适合用于货币计算;因为让一个float或者double 精确地表示0.1或者10的任何其他负数次方值,都是不可能的; * @author lee * */ public class Chape48 { /** * @param args */ public static void main(String[] args) { /** * 来看一个例子 * 你口袋里有1美元(100美分),你打算买糖,糖的价格为10美分20美分 * 30美分等等 一直到1美分 你打算从10美分的开始买,每种价格只买一个 * 那你能买几个糖呢?能找回多少呢? */ /* double sum = 1; int count = 0 ; for(double x = .10;x<sum;x+=.10) { sum-=x; count++; } System.out.println(sum); System.out.println(count);*/ /** * 输出结果是 * 0.3999999999999999和3 * 我们用手算一下 100-10-20-30=40 * 那就是说我们还可以买一个.40的糖 那么程序那里错了? * 错误就在于我们用了double * 解决办法就是用BigDecimal 或者int 或者long 进行货币的计算 */ BigDecimal sum1 = new BigDecimal("1"); BigDecimal price = new BigDecimal(".10"); int count1 = 0 ; for(BigDecimal b = price;sum1.compareTo(b) >=0 ;b=b.add(price)) { sum1 = sum1.subtract(b); count1++; } System.out.println(sum1); System.out.println(count1); /** * 输出结果0.00和4 这样就正确了 * 关于BigDecimal的方法我们下去再仔细看看; * 这里要说的是BigDecimal是引用数据类型 */ /** * 总而言之: 对于任何要精确答案的计算任务,请不要用double和float,如果你想 * 计算十进制小数点,并且不介意非基本类型带来的不便,那就用BigDecimal;使用 * BigDecimal还有个额外的好处就是他允许你完全控制舍入,每当一个操作涉及舍入的时候 * 它允许你从8种舍入模式中选择一种。如果你正确通过法定要求的舍入行为进行业务计算 * 使用BigDecimal时非常方便的;如果性能十分关键,并且你又不介意自己记录十进制的 * 小数点,而且涉及数值不大,就可以使用int或者long; * 如果数值范围没有超过9位的十进制数字,可以用int; 如果数值范围没有超过18位的十进制数字,用long 如果范围超过了18位数,那我们必须使用BigDecimal。 */ } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |