如何使用循环在javascript中将数字增加0.01?

hit*_*uct 23 javascript math floating-point for-loop

问题

我试图通过meteres从1.20m开始在2.50m结束时在控制台中建立一个高度列表.

我用过这段代码:

var heights = [];
for ( var i=1.20, l=2.5; i<l; i+=0.01 ){

    heights.push(i);

}

heights = heights.join('\n');
Run Code Online (Sandbox Code Playgroud)

如果console.log( heights )我得到:

1.2
1.21
1.22
1.23
...
Run Code Online (Sandbox Code Playgroud)

但是在1.37我开始得到:

1.37
1.3800000000000001
1.3900000000000001
1.4000000000000001
1.4100000000000001
1.4200000000000002
1.4300000000000002
Run Code Online (Sandbox Code Playgroud)

问题

  • 这是怎么回事?
  • 我如何解决它?

演示

下面是a demo如果你懒得把它在你的控制台类型:-)

Geo*_*ith 16

你做得很好.问题在于浮点数的不准确性.

为什么浮点数如此不准确?

如果您希望显示此号码,请使用:

heights[i].toFixed(2);
Run Code Online (Sandbox Code Playgroud)

请注意,如果要执行更多数值运算,则toFixed()返回一个字符串,并且必须转换回float(parseFloat()).

  • 提及`toFixed()`的+1会返回一个字符串. (6认同)
  • 由于这已经是公认的答案,因此应该考虑缩放数字而不是截断它们可能是更好的选择,而不仅仅是因为它避免了将数字转换为字符串并返回数字. (2认同)

phe*_*nal 8

这只是因为JavaScript中的数学运算方式,您可以找到许多解释它的答案 - 就像一样.最简单的解决方案是只做100次的所有时间,然后在添加到数组时进行划分,例如

var heights = [], i, l;
for (i = 120; i < 250; i += 1){    
    heights.push(i / 100);    
}
Run Code Online (Sandbox Code Playgroud)

你可以使用,toFixed但这会给你一个String结果.

  • 无论如何我会+1,因为我喜欢比`toFixed`更好地缩放数字. (3认同)