質問

私はMath.Pow()関数を使用していますが、次のコードを持っています。

double monthlyRate = (0.7d / 12);
int loanLength = 3;

double powerTest = Math.pow(1.00583, 36);
double powerResult = Math.pow((1 + monthlyRate),(loanLength * 12));

これがデバッガーを介して実行されると、値は

powerTest => 1.2327785029794363
powerResult => 7.698552870922063

1つ目は正しいものです。両方の割り当て行でMath.Pow関数に足を踏み入れました。 Powertestの場合、Math.PowのパラメーターはDouble A => 1.00583 Double B => 36.0です

PowerResultの場合、それらはダブルA => 1.005833333333333ダブルB => 36.0です

これは、浮遊点数学がマシンによって実行される方法の問題であることを知っています。それを修正する方法がわかりません。計算の前に、結果が悪いと次のことを試してみました。

monthlyRate = Math.round(monthlyRate * 1000) / 1000;
役に立ちましたか?

解決

1 + monthlyRate1.0583..., 、 いいえ 1.00583.

他のヒント

あなたの式0.7d/12 = 0.0583、Powertest式では0.00583を使用しています。

問題の一部はそれだと思います 0.7/12 ~ 0.058333, 、 と 1.0583 > 1.00583. 。私の賭けは、これがあなたの矛盾の真の原因であり、浮動小数点調整はそれとはほとんど関係がありません。

明らかに、Resut(1.23 ...および7.70)の大きな違いは、フロートのコーディング方法とは関係ありませんが、1+0.7/12 = 1.0583が1.00583とは異なる場所で間違いを犯しました。

Math.round(monthlyRate * 1000) / 1000.0;

整数部門を使用していました。

Javaで使用できます BigDecimal 正確な数字で生じるマネー業務を実行するために:それは Sun/Oracleが推奨する方法 お金番号を保存する。

// I'm using Strings for most accuracy

BigDecimal monthlyRate = new BigDecimal("0.7").divide(new BigDecimal(12));
int loanLength = 3;

BigDecimal powerTest = new BigDecimal("1.00583").pow(36);
BigDecimal powerResult = BigDecimal.ONE.add(monthlyRate).pow(loanLength * 12);
monthlyRate = ((double)Math.round(monthlyRate * 1000)) / 1000;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top