java.math.BigDecimal
10進数で無限精度の演算を実行する必要性に対するAnswer™だと思いました。
次のスニペットについて考えてみます。
import java.math.BigDecimal;
//...
final BigDecimal one = BigDecimal.ONE;
final BigDecimal three = BigDecimal.valueOf(3);
final BigDecimal third = one.divide(three);
assert third.multiply(three).equals(one); // this should pass, right?
私は合格することを期待しassert
ていますが、実際には実行はそこに到達していません:スローされるone.divide(three)
原因です!ArithmeticException
Exception in thread "main" java.lang.ArithmeticException:
Non-terminating decimal expansion; no exact representable decimal result.
at java.math.BigDecimal.divide
この動作はAPIで明示的に文書化されていることがわかります。
の場合
divide
、正確な商は無限に長い小数展開を持つ可能性があります。たとえば、1を3で割った値です。商に非終了の小数展開があり、正確な結果を返すように演算が指定されている場合、anArithmeticException
がスローされます。それ以外の場合は、他の操作の場合と同様に、除算の正確な結果が返されます。
APIをさらに参照すると、実際には、不正確な除算divide
を実行するさまざまなオーバーロードがあることがわかります。
final BigDecimal third = one.divide(three, 33, RoundingMode.DOWN);
System.out.println(three.multiply(third));
// prints "0.999999999999999999999999999999999"
もちろん、今の明らかな質問は「ポイントは何ですか?」です。財務計算など、正確なBigDecimal
算術が必要な場合の解決策だと思いました。正確に言えない場合、これはどれほど役立つでしょうか?それは実際に一般的な目的を果たしますか、それとも幸いなことにまったく必要のない非常にニッチなアプリケーションでのみ役立ちますか?divide
divide
これが正しい答えではない場合、財務計算の正確な除算に何を使用できますか?(つまり、私は財務専攻を持っていませんが、彼らはまだ除算を使用していますよね???)。