A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© whocases 黑马帝   /  2012-6-23 16:08  /  1997 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 whocases 于 2012-6-24 21:56 编辑

new BigDecimal()和BigDecimal.valueOf()的结果不相等。
那么这两个方法,有什么针对性的应用场景么?

3 个回复

倒序浏览
您的问题真是 很不负责任,
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回复,我是实在懒得回复你的。
回复 使用道具 举报
我有个事例,您能可以参考下。和你说的差不多。

     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来够造。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
如果你以后有机会做银行方面的项目,你用到的会比较多,或者是DRP,ERP中相关结算的项目,只要跟钱有关系的,肯定要精确啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马