黑马程序员技术交流社区

标题: BigDecimal的问题 [打印本页]

作者: whocases    时间: 2012-6-23 16:08
标题: BigDecimal的问题
本帖最后由 whocases 于 2012-6-24 21:56 编辑

new BigDecimal()和BigDecimal.valueOf()的结果不相等。
那么这两个方法,有什么针对性的应用场景么?
作者: 闾丘日月    时间: 2012-6-23 18:36
您的问题真是 很不负责任,
System.out.println(new BigDecimal(32).equals(BigDecimal.valueOf(32)));输出是true;
System.out.println(new BigDecimal("32.3").equals(BigDecimal.valueOf(32.3)));输出是true
当然还有
System.out.println(new BigDecimal("32.3").equals(BigDecimal.valueOf(32.3)));这个输出是false,
里面的equals判断和实现十分复杂,反正我是看不懂,但是
    public static BigDecimal valueOf(double val) {
        return new BigDecimal(Double.toString(val));
    }从源码中这个函数看来你所说的两种方法构建出来的对象应该并无不同,实际使用的时候怎么用都可以
至于为什么最后一个输出false,我就认为是sun公司那帮人写虚拟机时写出bug来了。具体再底层我就不关心了,也没那个能力去关心。
希望楼主提出的问题稍微有点自己的思考过程,不是看到你这个题是0回复,我是实在懒得回复你的。
作者: oracleserver    时间: 2012-6-24 21:57
我有个事例,您能可以参考下。和你说的差不多。

     Double db = 1.06D;
        System.out.println(db+"="+db);
        BigDecimal big = BigDecimal.valueOf(db);
        System.out.println(db+"="+big);
        BigDecimal big2 = new BigDecimal(db);
        System.out.println(db+"="+big2);



结果是

1.06=1.06
1.06=1.06
1.06=1.060000000000000053290705182007513940334320068359375

float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal

BigDecimal(double   val)  这个构造函数有如下说明:

Note:   the   results   of   this   constructor   can   be   somewhat   unpredictable.   One   might   assume   that   new   BigDecimal(.1)   is   exactly   equal   to   .1,   but   it   is   actually   equal   to   .1000000000000000055511151231257827021181583404541015625.   This   is   so   because   .1   cannot   be   represented   exactly   as   a   double   (or,   for   that   matter,   as   a   binary   fraction   of   any   finite   length).   Thus,   the   long   value   that   is   being   passed   in   to   the   constructor   is   not   exactly   equal   to   .1,   appearances   nonwithstanding.     
  The   (String)   constructor,   on   the   other   hand,   is   perfectly   predictable:   new   BigDecimal(".1")   is   exactly   equal   to   .1,   as   one   would   expect.   Therefore,   it   is   generally   recommended   that   the   (String)   constructor   be   used   in   preference   to   this   one.   
   
原来我们如果需要精确计算,非要用String来够造BigDecimal不可!在《Effective   Java》一书中的例子是用String来够造BigDecimal的,但是书上却没有强调这一点,这也许是一个小小的失误吧。   
      
   
  解决方案   
  现在我们已经可以解决这个问题了,原则是使用BigDecimal并且一定要用String来够造。
作者: 耿鑫    时间: 2012-6-25 09:28
如果你以后有机会做银行方面的项目,你用到的会比较多,或者是DRP,ERP中相关结算的项目,只要跟钱有关系的,肯定要精确啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2