toFixed不做任何事情

时间:2014-09-05 14:15:59

标签: javascript

我正在自学JavaScript并遇到了toFixed()的问题。我正在通过一个摊销计算器;并且,其中一个步骤返回一个带有大量小数位的数字。我试图把它减少到4位小数。 请注意,示例代码中包含大量解释性HTML。只有这样我才能完成这个等式的步骤。此外,当我在非常长的数字中添加一个时,它会将数字1添加到科学记数法的末尾。

var paymentamount;
var principal=250000;
var interestrate = 4.5;
var annualrate = interestrate/12;
var numberofpayments = 360;
document.write("This is the annuitized interest rate: "+ annualrate +"%");
document.write("<h3> Now we add 1 to the annualized interest rate</h3>");
var RplusOne = annualrate + 1;
document.write("<p> This is One Added to R: " + RplusOne + "%");
document.write("<h3>Next RplusOne is Raised to the power of N </h3>");
var RRaised = (Math.pow(RplusOne, numberofpayments)).toFixed(4);
document.write("<p>This gives us the following very long number, even thought it shouldn't: " + RRaised);
document.write("<h3>Now we add one to the very long number </h3>");
var RplusOne = RRaised + 1;
document.write("<p>Now we've added one: " + RplusOne);

1 个答案:

答案 0 :(得分:3)

来自MDN's documentation

  

如果number大于1e + 21,则此方法只调用Number.prototype.toString()并以指数表示法返回一个字符串。

问题在于您使用4.5作为利率而不是0.045,所以这样做:

Math.pow(4.5 / 12 + 1, 360)

为您提供了一个巨大的数字(确切地说是6.151362770461608e+496.15 * 10^49)。将您的利率更改为0.045,您将得到您所期望的。

对于var RplusOne = RRaised + 1行,此处的问题是由于RRaised toFixed是一个字符串。我只会在你展示东西时给toFixed打电话,而不是在任何其他时间;这样做的主要原因是为了避免在后续计算中出现舍入错误,但还有一个额外好处,即变量仍然是数字而不是字符串。