【问题标题】:Lack of precision of the toFixed method in javascriptjavascript中toFixed方法的精度不足
【发布时间】:2018-01-31 11:03:42
【问题描述】:

我在 chrome(v60.0.3112.101) 控制台中对Number.prototype.toFixed 方法做了一些测试,发现……让我很困惑。

为什么1.15.toFixed(1) 返回“1.1”而不是“1.2”?
为什么1.05.toFixed(1) 返回“1.1”而不返回“1.0”?
等等...


我在ECMAScript specification做研究。

注意 1 toFixed 返回一个字符串,其中包含以 十进制定点表示法 表示的此 Number 值,小数点后有 fractionDigits 位。如果 fractionDigits 未定义,则假定为 0。

我知道fixed point notation 是什么。但我无法解释上面的谜题。谁能给个清楚的解释?


顺便说一句,我认为specification 下的细节算法应该改进。 以 1.105 为例,相对算术如下:

令 n 为整数,n ÷ 10^f - x 的精确数学值尽可能接近于零。如果有两个这样的n,选择较大的n。

根据pick the larger n,应该考虑111而不考虑110,这与现实相矛盾。

【问题讨论】:

  • 引用的规范没有说明四舍五入,还有其他方法可以对数字进行四舍五入。为什么您希望此方法执行任何舍入?
  • 实际上数字是使用双精度浮点(en.wikipedia.org/wiki/Double-precision_floating-point_format)存储的,(1.15).toExponential(20) 给出 "1.14999999999999991118e+0" - 所以它更接近于 "1.1" ; (1.05).toExponential(20) 给出“1.05000000000000004441e+0” - 它更接近“1.1”
  • @JaromandaX 当然可以,但是 toFixed 方法和简单的四舍五入不一样。而Math.round 方法只是将数字四舍五入到最接近的整数。
  • @PageYe 我使用Number#toExponent(20) 只是为了显示更接近实际存储的数值

标签: javascript floating-point tofixed


【解决方案1】:

我会尽力澄清围绕该问题的要点。首先是定点符号:

我知道什么是定点符号。但我不能很好地解释它。

定点表示法与浮点表示法相反。大多数情况下,浮点表示法允许更好的精度。但它也更难理解和计算。

好吧,让我们回到定点符号。这也是实数的算术符号。不同之处在于定点表示法中的数字由具有比例因子的整数表示。 例如:

如果你想写 4.56 并且你有一个 1/1000 的比例因子,你的数字将由 4560 表示。实际上,4560 * (1/1000) = 4.56

现在我们知道了定点符号是如何工作的,我们可以更好地理解toFixed(n) 函数的结果。例如,假设比例因子为 1/1000(这不是实际值,但这样更容易将结果可视化)。

1.15.toFixed(1)

将采用十进制,然后用定点符号表示数字,因此它不关心“5”。你在内存中得到的数字是 1100。这就是为什么这个数字被四舍五入到最接近的下数值。

现在您可以在 toFixed 函数的 MDN Doc 上看到,您最多可以保留 20 位小数。根据这些信息,我们可以说比例因子是 1/10^20。

我希望能回答你的问题。

【讨论】:

  • 你怎么解释1.05.toFixed(1) return "1.1" but not the "1.0"?
  • 好吧,我刚刚测试了它。它返回“1.0”。也许这取决于您浏览器的数字方式。每个浏览器都有自己的 JS 解释器
猜你喜欢
  • 2012-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多