【问题标题】:Check if a BigDecimal is a multiple of another BigDecimal in Java 1.4检查 BigDecimal 是否是 Java 1.4 中另一个 BigDecimal 的倍数
【发布时间】:2012-09-03 15:21:53
【问题描述】:

我需要检查一个 BigDecimal 实例是否是另一个 BigDecimal 实例的倍数。由于我仅限于 Java 1.4,因此无法使用 BigDecimal.remainder(...)

我想出了以下代码:

/**
 * Returns <code>true</code> if <code>multiple</code> is a multiple of <code>base</code>.
 *
 * @param multiple
 * @param base
 * @return
 */
public static boolean isMultipleOf(final BigDecimal multiple, final BigDecimal base)
{
    if (multiple.compareTo(base) == 0)
        return true;

    try
    {
        multiple.divide(base, 0, BigDecimal.ROUND_UNNECESSARY);
        return true;
    }
    catch(ArithmeticException e)
    {
        return false;
    }
}

代码假定仅当multiple 除以base 的商为整数时才不需要舍入。这个假设正确吗?

编辑
结合 Lando 的提示,将商的比例显式设置为 0。否则下面的调用会错误返回true:

isMultipleOf(new BigDecimal("10.25"), new BigDecimal("5"));

编辑
编写了一个 JUnit 测试,发现我必须处理 multiplebase 都是 0 的特殊情况。所以我在上面的代码中添加了一个相等性测试。

【问题讨论】:

  • 可能是看 Java 1.6 左右的源码,它给了你想要的东西吗?
  • 值得注意的是,Java 6 即将结束免费支持,所以如果您升级,我建议直接使用 Java 7。;)
  • 难波里,我就是这么做的。然而,由于它具有良好的设计,高级功能是通过对多用途低级功能(主要是私有方法)的特定参数化调用来实现的。我最终会抄袭整个班级。看一看:grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/…
  • @PeterLawrey:是否升级以及何时升级不是我的决定 :( 代码必须在我们的客户应用服务器(SAP NetWeaver WebAS 7.0)上可执行,该服务器仅支持 Java 1.4。

标签: java bigdecimal java1.4


【解决方案1】:

javadoc 说...

抛出:ArithmeticException - 如果 divisor==0 或 roundingMode==ROUND_UNNECESSARY 且 this.scale() 不足以准确表示除法的结果。

所以假设似乎是正确的,如果scale() 不够,就会出现ArithmeticException;即余数非零。

【讨论】:

  • System.out.println(isMultipleOf(new BigDecimal("125"), new BigDecimal("10"))); 返回false。 1.25 的比例不同,比例为 2,125 的比例为 0。
【解决方案2】:

你应该改用这个:

multiple.divide(base, 0, BigDecimal.ROUND_UNNECESSARY);

因为如果你不通过零,它将应用股息的比例(除非你完全确定它的比例总是为零,在这种情况下你为什么不使用 BigInteger 呢?)

ArithmeticException - val==0,或 roundingMode==ROUND_UNNECESSARY 和 this.scale() 不足以表示除法的结果 正是

Source

【讨论】:

  • 好提示!股息的规模可以高达 2 倍,甚至更多。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-26
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多