0

私は 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

最初は正しいものです。両方の代入行で Math.pow 関数に足を踏み入れました。powerTest の場合、Math.pow のパラメーターは double a => 1.00583 double b => 36.0 です。

powerResult の場合、double a => 1.0058333333333333 double b => 36.0 です。

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

monthlyRate = Math.round(monthlyRate * 1000) / 1000;
4

7 に答える 7

9

1 + monthlyRateでは1.0583...ありません1.00583

于 2011-01-25T16:48:54.050 に答える
3

式 0.7d/12 = 0.0583、powerTest 式では 0.00583 を使用しています。

于 2011-01-25T16:50:23.187 に答える
2

問題の一部は0.7/12 ~ 0.058333、および1.0583 > 1.00583. 私の賭けは、これがあなたの不一致の真の原因であり、浮動小数点の調整はそれとはほとんど関係がありません.

于 2011-01-25T16:50:14.337 に答える
2

明らかに、resut(1.23... と 7.70) の大きな違いは、フロートのコーディング方法とは関係ありませんが、1+0.7/12 = 1.0583 は 1.00583 とは異なります;-)。

于 2011-01-25T16:53:20.210 に答える
1
Math.round(monthlyRate * 1000) / 1000.0;

整数除算を使用していました。

于 2011-01-25T16:48:06.603 に答える
1

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);
于 2011-01-25T16:52:02.310 に答える
0
monthlyRate = ((double)Math.round(monthlyRate * 1000)) / 1000;
于 2011-01-25T16:54:59.400 に答える