toPrecision()函数中的Javascript错误

toPrecision()函数中的Javascript错误,javascript,Javascript,我想在显示之前使用toPrecision减小数字的大小。然而,有时我无法将函数的输出乘以另一个数字,而不会得到一个小的舍入误差。请参见下面的代码示例: var x = 0.0197992182093305 alert (x.toPrecision(4)) //Correct: 0.01980 alert (Number(x.toPrecision(4))) //Correct: 0.0198 alert( Number(x.toPrecision(4)) * 100) //Incorrect:

我想在显示之前使用toPrecision减小数字的大小。然而,有时我无法将函数的输出乘以另一个数字,而不会得到一个小的舍入误差。请参见下面的代码示例:

var x = 0.0197992182093305
alert (x.toPrecision(4)) //Correct: 0.01980
alert (Number(x.toPrecision(4))) //Correct: 0.0198
alert( Number(x.toPrecision(4)) * 100) //Incorrect: 1.9800000000000002

JSFIDLE:这是怎么回事?

根据我的理解,Numberx.toPrecision4*100创建了一个新的数字对象,它不会继承父对象的精度

如果你仍然想在数学运算后保持精确,你需要再次将其精确

alert((x * 100).toPrecision(4));

从技术上讲,这不是一个错误。这正是javascript的工作方式。

根据我的理解,Numberx.toPrecision4*100创建了一个新的Number对象,它不会继承父对象的精度

如果你仍然想在数学运算后保持精确,你需要再次将其精确

alert((x * 100).toPrecision(4));

从技术上讲,这不是一个错误。这正是javascript的工作方式。

除非您试图做一些琐碎的事情,否则使用基本构造函数并不是那么理想。你能试着在下面的小提琴上做代码,看看这是否对你有用吗


除非您试图做一些琐碎的事情,否则使用基本构造函数并不是那么理想。你能试着在下面的小提琴上做代码,看看这是否对你有用吗


Javascript没有十进制等价物,所以在您的例子中使用浮点。这意味着Numberx.toPrecision4并没有给出精确的0.0198,而是最接近0.0198的FP二进制数。因此,您所做的任何运算都会受到浮点运算中引入的精度损失的影响。如果你这样做,你也会看到同样的效果

 alert(0.0198 * 100);
顺便说一下

  alert(0.0198 * 10 * 10);

毫无疑问,精度损失的累积不足以使其成为Javascript认为要显示的数字,但这仅限于此特定数字。

Javascript没有十进制等效数字,因此在您的情况下使用浮点。这意味着Numberx.toPrecision4并没有给出精确的0.0198,而是最接近0.0198的FP二进制数。因此,您所做的任何运算都会受到浮点运算中引入的精度损失的影响。如果你这样做,你也会看到同样的效果

 alert(0.0198 * 100);
顺便说一下

  alert(0.0198 * 10 * 10);

没有问题精度损失的积累不足以使其成为Javascript认为要显示的数字,但这只是针对这个特定数字。

造成问题的不是函数。看看其他人。上面的数字都不能用二进制浮点表示,所以不要指望没有正确的字符就可以正确地打印出来formatting@EricBaldwin-我只是对我的回答做了一点修改,以澄清*10*10不会导致任何问题-但仅针对这个特定案例。你可能有一个数字,即使是*10,精度的损失也会增加,这不是造成问题的函数。看看其他人。上面的数字都不能用二进制浮点表示,所以不要指望没有正确的字符就可以正确地打印出来formatting@EricBaldwin-我只是对我的回答做了一点修改,以澄清*10*10不会导致任何问题-但仅针对这个特定案例。即使使用*10,也可能会出现精度损失的数字。这里不需要数字函数。x*100.toPrecision4可以。谢谢你的建议。更新了我的答案。这里不需要数字功能。x*100.toPrecision4可以。谢谢你的建议。更新了我的答案。