繁体   English   中英

toFixed(2)函数不起作用

[英]toFixed(2) function not working

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

这是主要功能:

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.569999999999986没有减少到34.56 知道什么是错的吗?

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

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

如您所见, 1.23 - 1的输出为0.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

您可能希望使用Math.round

Math.round(1.35 * 10) / 10
// => 1.4
Math.round(1.45 * 10) / 10
// => 1.5

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

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

演示


这就是为什么你的//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

所以你不能再调用onFixed,因为:

  1. 这是一个字符串
  2. 它甚至不是有效数字

那么,你会如何解决这个问题? 通过乘以1(或Number() )将其转换为数字;

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

演示

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

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

而是用它来显示:

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

它在您的第一个示例中起作用的原因是因为您在每次传递时将价格值重置为577。

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

你可以放弃在randomVal上调用的第一个.toFixed。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM