Javascript:数字的字符串表示

时间:2014-01-29 20:18:48

标签: javascript string-formatting floating-point-precision

javascript如何将数字转换为字符串?我希望它将数字四舍五入到一定的精度,但看起来并非如此。我做了以下测试:

> 0.1 + 0.2
0.30000000000000004
> (0.1 + 0.2).toFixed(20)
'0.30000000000000004441'
> 0.2
0.2
> (0.2).toFixed(20)
'0.20000000000000001110'

这是Safari 6.1.1,Firefox 25.0.1和node.js 0.10.21中的行为。

看起来javascript显示小数点后的第17位(0.1 + 0.2),但隐藏它为0.2(因此数字舍入为0.2)。

javascript中数字到字符串转换的确切程度如何?

2 个答案:

答案 0 :(得分:2)

来自问题的作者:

我在ECMA脚本规范中找到了答案:http://www.ecma-international.org/ecma-262/5.1/#sec-9.8.1

打印数字时,javascript调用toString()。 toString()的规范解释了javascript如何决定要打印的内容。以下注释

The least significant digit of s is not always uniquely determined by the requirements listed in step 5.

以及此处的http://www.ecma-international.org/ecma-262/5.1/#sec-15.7.4.5

The output of toFixed may be more precise than toString for some values because toString only prints enough significant digits to distinguish the number from adjacent number values.

解释toString()行为背后的基本思想。

答案 1 :(得分:0)

这不是关于javascript的工作方式,而是关于浮点运算的一般工作方式。计算机以二进制方式工作,但人们大多在10号基地工作。这在这里和那里引入了一些不精确的东西;不精确的程度取决于硬件和(有时)软件的工作原理。但关键是你无法准确预测错误是什么,只会出现错误。

Javascript没有像#34这样的规则;对于某些数字,在小数点后显示这么多数字,但对于其他数字则不显示。"相反,计算机正在为您提供所需数量的最佳估计。 0.2不是可以用二进制文件轻松表示的东西,所以如果你告诉计算机使用的精度比其它方式更高,你会得到舍入错误(最后1110,在这种情况下)

这实际上是与this old one相同的问题。从优秀的社区维基回答那里:

  

所有floating point数学都是这样的,基于IEEE 754 standard。 JavaScript使用64位浮点表示,这与Java的double相同。