任何人都可以推荐一种有效的方法来确定a是否BigDecimal
是数学意义上的整数值?
目前我有以下代码:
private boolean isIntegerValue(BigDecimal bd) {
boolean ret;
try {
bd.toBigIntegerExact();
ret = true;
} catch (ArithmeticException ex) {
ret = false;
}
return ret;
}
Run Code Online (Sandbox Code Playgroud)
...但是如果有必要,我希望避免对象创建开销.以前我正在使用bd.longValueExact()
哪个会避免创建一个对象,如果BigDecimal
它在内部使用它的紧凑表示,但显然会失败如果值太大而不适合长.
任何帮助赞赏.
小智 69
编辑:从Java 8开始,stripTrailingZeroes()现在占零
BigDecimal stripTrailingZeros不适用于零
所以
private boolean isIntegerValue(BigDecimal bd) {
return bd.stripTrailingZeros().scale() <= 0;
}
Run Code Online (Sandbox Code Playgroud)
现在完全没问题.
如果您使用某些答案中提到的scale()
和stripTrailingZeros()
解决方案,您应该注意零.零总是一个整数,无论它具有什么规模,并且stripTrailingZeros()
不会改变零BigDecimal的规模.
所以你可以这样做:
private boolean isIntegerValue(BigDecimal bd) {
return bd.signum() == 0 || bd.scale() <= 0 || bd.stripTrailingZeros().scale() <= 0;
}
Run Code Online (Sandbox Code Playgroud)
小智 6
将数字除以1并检查余数.除以1时,任何整数应始终具有0的余数.
public boolean isWholeNumber(BigDecimal number) {
return number.remainder(BigDecimal.ONE).compareTo(BigDecimal.ZERO) == 0;
}
Run Code Online (Sandbox Code Playgroud)
小智 5
您可以使用它(仅从其他答案中总结):
private boolean isIntegerValue(BigDecimal bd) {
return bd.stripTrailingZeros().scale() <= 0;
}
Run Code Online (Sandbox Code Playgroud)
小智 5
这可以通过与某人检查 double 是否是整数相同的方式来完成,执行 % 1 == 0。这就是查找 BigDecimal 值的方式。
public static boolean isIntegerValue(BigDecimal bd){
return bd.remainder(BigDecimal.ONE).compareTo(BigDecimal.ZERO) == 0;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
34795 次 |
最近记录: |