检查 BigDecimal 在 Java 中是否为整数

2022-08-31 15:49:51

确定 a 是否为数学意义上的整数值的有效方法是什么?BigDecimal

目前我有以下代码:

private boolean isIntegerValue(BigDecimal bd) {
    boolean ret;
    
    try {
        bd.toBigIntegerExact();
        ret = true;
    } catch (ArithmeticException ex) {
        ret = false;
    }

    return ret;
}

...但希望尽可能避免对象创建开销。

以前我使用的是,如果 内部使用其紧凑表示形式,它将避免创建对象,但如果值太大而无法放入长整型,显然会失败。bd.longValueExact()BigDecimal


答案 1

编辑:从Java 8开始,stripTrailingZeroes()现在占零

BigDecimal stripTrailingZeros 不适用于零

所以

private boolean isIntegerValue(BigDecimal bd) {
  return bd.stripTrailingZeros().scale() <= 0;
}

现在完全没问题。


如果您使用某些答案中提到的和解决方案,则应注意零。零始终是一个整数,无论它具有什么刻度,并且不会改变零大十进制的刻度。scale()stripTrailingZeros()stripTrailingZeros()

所以你可以做这样的事情:

private boolean isIntegerValue(BigDecimal bd) {
  return bd.signum() == 0 || bd.scale() <= 0 || bd.stripTrailingZeros().scale() <= 0;
}

答案 2

根据值的来源/用法,首先检查刻度是否<= 0可能会更快。如果是,那么它绝对是数学意义上的整数值。如果它>0,那么它可能仍然是一个整数值,并且需要更昂贵的测试。BigDecimal


推荐