Java的Math.Pow()函数返回令人困惑的结果

时间:2011-01-25 16:45:17

标签: java pow

我正在使用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;

7 个答案:

答案 0 :(得分:9)

1 + monthlyRate1.0583...,而不是1.00583

答案 1 :(得分:3)

你的表达式0.7d / 12 = 0.0583,在powerTest表达式中你使用的是0.00583。

答案 2 :(得分:2)

我认为问题的一部分是0.7/12 ~ 0.0583331.0583 > 1.00583。我敢打赌,这是你的差异的真正来源,浮点调整与它没什么关系。

答案 3 :(得分:2)

显然,resut(1.23 ......和7.70)的这种巨大差异与浮点数的编码方式无关,但比你在某处犯了错误更多 1 + 0.7 / 12 = 1.0583与1.00583不同; - )。

答案 4 :(得分:1)

Math.round(monthlyRate * 1000) / 1000.0;

您使用的是整数除法。

答案 5 :(得分: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);

答案 6 :(得分:0)

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