BigDecimal.比较大小的坑

同志们,搬砖过程中经常需要比较BigDemical与0的大小;

前人留下的代码中,一直是使用以下方法,伪代码如下:

        BigDecimal num = new BigDecimal("xxxxxx");

        if(num.intValue() > 0) {
            num = num.negate();
        }

 

当然,一直以来都没有出现过什么问题。

就在今天,突然发现这个值并没有变成负数;

从逻辑上看没什么明显的差错,但是这里面有个大坑!!!!

首先看一下以下代码的运行结果:

/**
 * int的取值范围是-2^31 - 2^31-1 ,也就是-2147483648 - 2147483647
 */
public class BigDemicalTest_1 {

    public static void main(String[] args) {


        BigDecimal num = new BigDecimal("2010001000");
        System.out.println(num.intValue());

        num = new BigDecimal("2147483647");
        System.out.println(num.intValue());

        num = new BigDecimal("2247483647");
        System.out.println(num.intValue());
    }
}

 

运行结果:

2010001000
2147483647
-2047483649

 

惊奇地发现,最后一个数值转换为intValue();竟然是-负数;

这是由于BigDemical数值太大了,超过了int的范围,转为int时会截取低32位(个人猜测);

总结:

BigDemical进行比较大小时,尤其是与数字0进行比较时,最好使用

.compareTo(BigDecimal demical)

,尽量不使用 num.intValue() > 0;这种写法,以免由于数值过大,造成逻辑错误。

 
posted @ 2022-03-09 17:01  豆浆不要糖  阅读(113)  评论(0)    收藏  举报