检查 BigDecimal 是否是 Java 中的整数

新手上路,请多包涵

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

目前我有以下代码:

 private boolean isIntegerValue(BigDecimal bd) {
    boolean ret;

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

    return ret;
}

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

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

原文由 Adamski 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

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

原文由 Joachim Sauer 发布,翻译遵循 CC BY-SA 2.5 许可协议

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

BigDecimal stripTrailingZeros 不适用于零

所以

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;
}

原文由 tobi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题