Java中的BigDecimal使用注意事项

本文介绍了BigDecimal的正确使用方法,包括其不可变性特点、避免使用equals进行数值比较、推荐使用compareTo和signum方法、以及使用字符串构造函数的重要性等方面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.BigDecial是immutable的,就像String一样,它的所有操作都会生成一个新的对象,所以

 amount.add( thisAmount );

是错误的;而应该是:

 amount = amount.add( thisAmount );


2. 不要用equals方法来比较BigDecimal对象,因为它的equals方法会比较scale,如果scale不一样,它会返回false;例如:

 BigDecimal a = new BigDecimal("2.00");
 BigDecimal b = new BigDecimal("2.0");
 print(a.equals(b)); // false

所以你应该使用compareTo()和signum()方法

 a.compareTo(b);  // returns (-1 if a < b), (0 if a == b), (1 if a > b)
 a.signum(); // returns (-1 if a < 0), (0 if a == 0), (1 if a > 0)

3. 使用BigDecimal的字符串构造函数,不要使用double参数的构造函数,否则的话会出现你不想要的结果。

例如下面的代码分别使用double和String的构造函数,然后使用HALF_EVEN的round方法,但是输出结果不一样:

        System.out.println("==================");
        for(int i = 0; i < 10;  i ++) {
            StringBuffer sb = new StringBuffer();
            sb.append("0.");
            sb.append(i);
            sb.append("5");
            BigDecimal bdx = new BigDecimal(sb.toString());
            System.out.println(sb + " " +bdx.setScale(1, RoundingMode.HALF_EVEN));
        }
        
        System.out.println("==================");
        for(int i = 0; i < 10;  i ++) {
            StringBuffer sb = new StringBuffer();
            sb.append("0.");
            sb.append(i);
            sb.append("5");
            BigDecimal bdx = new BigDecimal(Double.valueOf(sb.toString()));
            System.out.println(sb + " " +bdx.setScale(1, RoundingMode.HALF_EVEN));
        }

输出是:

==================

0.05 0.0
0.15 0.2
0.25 0.2
0.35 0.4
0.45 0.4
0.55 0.6
0.65 0.6
0.75 0.8
0.85 0.8
0.95 1.0
==================
0.05 0.1
0.15 0.1
0.25 0.2
0.35 0.3
0.45 0.5
0.55 0.6
0.65 0.7
0.75 0.8
0.85 0.8
0.95 0.9

http://www.opentaps.org/docs/index.php/How_to_Use_Java_BigDecimal:_A_Tutorial



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值