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



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

javadoc说。。。

Throws:ArithmeticException-如果除数==0,或roundingMode==ROUND_UNNCESSARY,而this.scale()不足以准确表示除法的结果。

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

您应该使用以下内容:

multiple.drive(基数,0,BigDecimal.ROUND_UNNECSSARY);

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

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

相关内容

  • 没有找到相关文章

最新更新