3

我需要检查一个 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 测试,发现我必须处理这两个和都是
的特殊情况。所以我在上面的代码中添加了一个相等性测试。multiplebase0

4

2 回答 2

2

javadoc说...

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

因此,如果不充分,就会发生an的假设似乎是正确的;即余数非零。ArithmeticExceptionscale()

于 2012-09-03T15:28:56.717 回答
2

你应该改用这个:

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

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

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

资源

于 2012-09-03T17:44:23.277 回答