3

BigDecimalインスタンスが別のBigDecimalインスタンスの倍数であるかどうかを確認する必要がありました。私はJava1.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整数の場合にのみ丸めが不要であると想定しています。この仮定は正しいですか?

Edit
Incorporated by Landoは、商のスケールを明示的にに設定し0ます。そうしないと、次の呼び出しが誤って返されtrueます。

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

編集
JUnitテストを書きましたが、とが両方であるという特殊なケースに対処する必要があることがわかりmultipleましbase0。そこで、上記のコードに同等性のテストを追加しました。

4

2 に答える 2

2

javadocによると...

スロー:ArithmeticException -divisor == 0、またはroundingMode == ROUND_UNNECESSARYで、this.scale()が除算の結果を正確に表すには不十分な場合。

したがって、が十分でない場合に発生するという仮定は正しいように思われます。つまり、余りはゼロ以外です。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 に答える