检查BigDecimal是否为整数值

Ada*_*ski 46 java bigdecimal

任何人都可以推荐一种有效的方法来确定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)


Joa*_*uer 14

根据BigDecimal值的来源/用途,可能会更快地检查比例是否<= 0.如果是,则它绝对是数学意义上的整数值.如果是> 0,则它可能仍是一个整数值,并将需要更昂贵的测试.


小智 6

将数字除以1并检查余数.除以1时,任何整数应始终具有0的余数.

public boolean isWholeNumber(BigDecimal number) {
    return number.remainder(BigDecimal.ONE).compareTo(BigDecimal.ZERO) == 0;
}
Run Code Online (Sandbox Code Playgroud)

  • 可能值得添加 `number.scale() &lt;= 0 || ...` 在计算余数并检查零之前,以避免在比例指示它绝对是整数时不必要的开销。 (2认同)

小智 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)