2011-01-25 13 views
0
私はMath.pow()関数での作業、および次のコードを持っています

:これは、デバッガを介して実行されるJavaの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ため パラメータはpowerResultについては ダブル=> 1.00583 ダブルB => 36.0

あり、彼らはダブル=> 1.0058333333333333 ダブルB => 36.0

ある私が知っています浮動小数点演算がマシンで実行される方法に問題があることは、私はそれを修正する方法がわかりません。あなたは整数の除算を使用していた

monthlyRate = Math.round(monthlyRate * 1000)/1000; 
+0

あなたは(1+(0.7/12))^(3?12)から何を期待していますか?私は7.6985528709220588862786を通常の電卓に入れます。 –

+0

Javaの場合、お金の操作を実行するにはBigDecimalを使用する必要があります。私の答えをチェックしてください。 – vz0

答えて

9

1 + monthlyRateは、1.00583ではなく、1.0583...である。

+0

私はこれを30分間見つめて、そのタイプミスを逃したとは信じられません。助けてくれてありがとう。 –

1
Math.round(monthlyRate * 1000)/1000.0; 

:私は悪い結果と計算する前に次のことをやってみました。

+0

これを無視すると、** axtavt **が指摘するように、実際の問題は余分なゼロになります。 OPが実際に丸めを実行したい場合に備えて、私は答えを残します。 –

+0

ニキータありがとう、今後同様の機能を書かなければならないと私は気付くでしょう –

2

私は問題の一部が0.7/12 ~ 0.0583331.0583 > 1.00583だと思います。私の賭けはこれがあなたの不一致の真の原因であるということです。浮動小数点の調整はそれとはほとんど関係ありません。

3

あなたの式0.7d/12 = 0.0583、あなたが使用しているpowerTest式で0.00583。

1

Javaの場合、BigDecimalを使用して、正確な数値に基づいてお金の操作を行うことができます。お金の番号を保存するのはSun/Oracle recommended wayです。

// 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); 
+1

あなたのdownvotesを説明してください。 OPはマネーオペレーションを実行していますが、* BigDecimalを使用していなければなりません。 – vz0

2

明らかresut(1.23 ...と7.70)で、このような大きな違いは山車が符号化されている方法とは関係ありませんが、あなたはどこか 1 + 0.7/12ミスを犯した以上= 1.0583が異なっています1.00583から;-)。

0
monthlyRate = ((double)Math.round(monthlyRate * 1000))/1000;