4

javaクラスで計算したいのですがBigDecimal、周期的な数値でいつも例外が出てしまいます。私はインターネットで探していましたが、残念ながら何も見つかりませんでした。多分誰かがそれを修正するのを手伝ってくれるでしょう。

例:

System.out.println(new BigDecimal(1).divide(new BigDecimal(3)));  
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion;   no exact representable decimal result.  
    at java.math.BigDecimal.divide(Unknown Source)  
    at Berechne.rechne(Berechne.java:16)  
    at Berechne.main(Berechne.java:39)  

System.out.println(new BigDecimal(1).divide(new BigDecimal(4))); --> 0.25

4

2 に答える 2

4

で除算しようとして13ます。これは、小数点以下の数値が繰り返されます。これはウィキペディアが言うことです:

算術では、小数の繰り返しは有理数を表す方法です。したがって、数値の 10 進数表現は、ある時点で周期的になる場合、つまり無限に繰り返される有限の数字列がある場合、反復 10 進数 (または反復 10 進数) と呼ばれます。たとえば、1/3 = 0.3333333… または 0.3 の 10 進数表現 (「0.3 繰り返し」または「0.3 繰り返し」と呼ばれる) は、小数点の直後で周期的になり、1 桁のシーケンス「3」を無限に繰り返します。

精度と丸めモードを指定していません。BigDecimal は、無限の小数点以下の桁数を使用できると不平を言っていますが、それでも数値を正確に表現することはできません。

ドキュメントを見てください:

MathContext オブジェクトが 0 の精度設定で提供される場合 (MathContext.UNLIMITED など)、算術演算は、MathContext オブジェクトを使用しない算術メソッドと同様に正確です。(これは、5 より前のリリースでサポートされていた唯一の動作です。)

正確な結果を計算する結果として、精度設定が 0 の MathContext オブジェクトの丸めモード設定は使用されないため、無関係です。除算の場合、正確な商は無限に長い 10 進展開を持つ可能性があります。たとえば、1 を 3 で割った値です。

商に非終了小数展開があり、演算が正確な結果を返すように指定されている場合、ArithmeticException がスローされます。それ以外の場合は、他の演算と同様に、除算の正確な結果が返されます。

これを回避するには、divide(BigDecimal divisor, int scale, int roundingMode)を使用できます

于 2013-07-09T07:28:38.787 に答える