确定 BigDecimal
是否为数学意义上的整数值的有效方法是什么?
目前我有以下代码:
private boolean isIntegerValue(BigDecimal bd) {
boolean ret;
try {
bd.toBigIntegerExact();
ret = true;
} catch (ArithmeticException ex) {
ret = false;
}
return ret;
}
...但希望尽可能避免创建对象的开销。
以前我使用 bd.longValueExact()
如果 BigDecimal
在内部使用其紧凑表示,则可以避免创建对象,但如果值为太大了,放不下。
最佳答案
编辑:从 Java 8 开始,stripTrailingZeroes() 现在占零
BigDecimal stripTrailingZeros doesn't work for zero
所以
private boolean isIntegerValue(BigDecimal bd) {
return bd.stripTrailingZeros().scale() <= 0;
}
现在完全好了。
如果使用部分答案中提到的scale()
和stripTrailingZeros()
解决方案,应注意归零。零总是一个整数,无论它有什么比例,并且 stripTrailingZeros()
不会改变零 BigDecimal 的比例。
所以你可以这样做:
private boolean isIntegerValue(BigDecimal bd) {
return bd.signum() == 0 || bd.scale() <= 0 || bd.stripTrailingZeros().scale() <= 0;
}
关于java - 检查 BigDecimal 是否是 Java 中的整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1078953/