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

第一个是正确的。我已经踏入了两个分配行上的数学函数。对于POWERTEST,数学的参数为double a => 1.00583 double b => 36.0

对于PowerResult,它们是双a => 1.0058333333333333 double b => 36.0

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

monthlyRate = Math.round(monthlyRate * 1000) / 1000;
有帮助吗?

解决方案

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

其他提示

您的表达式0.7D/12 = 0.0583,在使用0.00583的POWERTESTERS中。

我认为问题的一部分是 0.7/12 ~ 0.058333, , 和 1.0583 > 1.00583. 。我敢打赌,这是您差异的真正来源,浮点调整与它无关。

显然,重新拆卸(1.23 ...和7.70)的差异与浮子的编码方式无关,但比您在1+0.7/12 = 1.0583的地方犯了一个错误的方式与1.00583 ;--)不同。

Math.round(monthlyRate * 1000) / 1000.0;

您正在使用整数部门。

在Java上,您可以使用 bigdecimal 执行导致准确数字的资金操作:这是 太阳/甲骨文推荐的方式 存储货币数字。

// 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