toFixed(2)函数不起作用

时间:2012-12-22 02:32:32

标签: javascript jquery

这个很奇怪,因为我在this fiddle中运行了它,但它在the main fiddle中无效。我相信代码是一样的。

这是主要功能:

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);

34.569999999999986之类的值并未缩减为34.56。 知道什么是错的吗?

5 个答案:

答案 0 :(得分:11)

这与在二进制浮点值和十进制表示之间进行转换时发生的常见问题有关。请参阅this fiddle,这就像您的“工作”一样,但我更改了price值,以便它也会中断。

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

如您所见,1.23 - 1的输出为0.22999999999999998。这明显偏离了一点点,但它与计算机代表数字的方式有关。

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

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


更新

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


更新2

另请注意,1.35.toFixed(1); // => 1.4 1.45.toFixed(1); // => 1.4 可能会出现意外的舍入行为。在控制台中尝试以下操作:

Math.round

您可能希望改为使用Math.round(1.35 * 10) / 10 // => 1.4 Math.round(1.45 * 10) / 10 // => 1.5

{{1}}

答案 1 :(得分:3)

浮点数是近似值,因此当您添加时,它们并不总是以干净的数字结束。只需在显示时调用toFixed:

companies[i].price += randomVal;
$('#price'+i).html(companies[i].price.toFixed(2));

Demo


这就是您的//companies[i].price = companies[i].price.toFixed(2);无效的原因:

toFixed()返回一个字符串,因此在第一次调用后,companies[i].price是一个字符串。执行companies[i].price += randomVal;时,它正在进行字符串连接而不是数字加法。它会产生类似的东西:

577.05
577.050.05
577.050.050.1

所以你不能再打电话给它了,因为:

  1. 这是一个字符串
  2. 它甚至不是有效数字
  3. 那么,你会如何解决这个问题?通过乘以1(或Number());

    将其转换为数字
    companies[i].price += randomVal;
    companies[i].price = companies[i].price.toFixed(2)*1;
    $('#price'+i).html(companies[i].price);
    

    Demo

    使用这些解决方案中的任何一个,都不需要第一次调用toFixed()

答案 2 :(得分:1)

这是因为在应用.toFixed()之后,您将该值添加到另一个变量,这会导致精度再次变得混乱。

而是用它来显示:

$('#price'+i).html(companies[i].price.toFixed(2));

答案 3 :(得分:0)

它在你的第一个例子中起作用的原因是因为你在每次通过时将价格值重置为577。

试试这个,它在计算总和后调用价格上的.toFixed(2)并将其返回给你的变量。

你可能会放弃第一个.toFixed thats on randomVal。

 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 = Number(companies[i].price.toFixed(2)); 
        $('#price'+i).html(companies[i].price);
    }
}, 1000);

答案 4 :(得分:0)

您的转化数据是回复[25]并按照以下步骤操作。

var i = parseFloat(response[25]).toFixed(2)
console.log(i)//-6527.34