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,它们是双 a => 1.0058333333333333 双 b => 36.0

我知道这是机器执行浮点数学的方式的问题,我只是不确定如何纠正它。我在计算之前尝试了以下操作,结果很差:

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

7 回答 7

9

1 + monthlyRate1.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 回答