java - 检查 BigDecimal 是否是 Java 中的整数

标签 java bigdecimal

确定 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/

相关文章:

java - JmsTemplate.convertAndSend抛出未分类异常-ActiveMQ SpringBoot配置

java - 为什么我从 gif 文件转换的 jpg 文件不清晰?

java - 为什么 Bigdecimal(double d) 构造仍然存在?

java - BigDecimal 格式与 DecimalFormat

java - 对作为扫描仪输入的 BigDecimals 进行验证

java - 如何在 Spring Data JPA 中定义 BigDecimal 的 BigDecimal 舍入策略?

java - 如何在我的应用程序中使用 ua-parser?

java - 将 <div> 数据传递给 servlet (ACE - EDITOR)

java - Android处理程序缩短延迟?

java - 在 Java 中格式化 Bigdecimal