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中数字到字符串转换的确切程度如何?
答案 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
相同。