检查BigDecimal是否是Java 1.4中另一个BigDecimal的倍数

时间:2012-09-03 15:21:53

标签: java bigdecimal java1.4

我需要检查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的特殊情况。所以我在上面的代码中添加了一个相等的测试。

2 个答案:

答案 0 :(得分:2)

javadoc说......

  

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

所以假设似乎正确如果ArithmeticException不够,则会发生scale();即余数不为零。

答案 1 :(得分:2)

你应该使用它:

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

因为如果你没有传递零,它将应用被除数的比例(除非你完全确定它的比例总是为零,在这种情况下你为什么不使用BigInteger呢?)

  

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

Source