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;这种写法,以免由于数值过大,造成逻辑错误。

浙公网安备 33010602011771号