toFixed(2)函数不起作用

Rah*_*sai 5 javascript jquery

这个很奇怪,因为我让它在这个小提琴中运行,但它并不适用于主要小提琴.我相信代码是一样的.

这是主要功能:

window.setInterval(function(){
    for(var i=0; i < companies.length; i++) {
        var randomVal = (Math.random()*(10 - (-10) + 1)) + (-10);
        randomVal = randomVal / 100;
        randomVal = Number(randomVal.toFixed(2));
        companies[i].price += randomVal;
        //companies[i].price = companies[i].price.toFixed(2);
        $('#price'+i).html(companies[i].price);
    }
}, 1000);
Run Code Online (Sandbox Code Playgroud)

像这样的价值34.569999999999986被削减到了34.56.知道什么是错的吗?

Nat*_*all 11

这与在二进制浮点值和十进制表示之间进行转换时发生的常见问题有关.看到这个小提琴,就像你的"工作",但我改变了price价值,以便它也打破.

这是一个更简单的演示,可以解决问题的核心:http://jsfiddle.net/2NHSM/4/

如你所见,输出1.23 - 10.22999999999999998.这显然是稍微偏离,但它与计算机代表数字的方式有关.

计算机将数字作为二进制数字.1.23实际上是二进制的"重复十进制"(就像1/7在十进制中重复一样),因此没有100%准确的方式来存储它.因此,当你减去时,你1.23 - 1会得到一个稍微偏离的答案,因为1.23从来没有准确的开始.

在你的情况下也会发生同样的事情.要修复它,只需toFixed在显示值之前使用,而不是在向其添加其他内容之前使用.


更新

这是一个工作小提琴:http://jsfiddle.net/2NHSM/6/


更新2

另请注意,toFixed可能会出现意外的舍入行为.在控制台中尝试以下操作:

1.35.toFixed(1);
// => 1.4
1.45.toFixed(1);
// => 1.4
Run Code Online (Sandbox Code Playgroud)

您可能想要使用Math.round.

Math.round(1.35 * 10) / 10
// => 1.4
Math.round(1.45 * 10) / 10
// => 1.5
Run Code Online (Sandbox Code Playgroud)