Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:数字的字符串表示_Javascript_String Formatting_Floating Point Precision - Fatal编程技术网

Javascript:数字的字符串表示

Javascript:数字的字符串表示,javascript,string-formatting,floating-point-precision,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

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在(0.1+0.2)的小数点后显示第17位,但在0.2时隐藏该数字(因此该数字四舍五入为0.2)


在javascript中,数字到字符串的转换到底是如何工作的?

这不是关于javascript如何工作的,而是关于浮点操作通常是如何工作的。计算机以二进制工作,但人们大多以10为基数工作。这在这里和那里引入了一些不精确性;不精确的程度取决于所讨论的硬件和(有时)软件的工作方式。但关键是你不能准确预测错误会是什么,只能预测会有错误

Javascript没有“某些数字在小数点后显示如此多的数字,而其他数字则不显示”这样的规则。相反,计算机会为您提供所需数字的最佳估计值
0.2
不是很容易用二进制表示的东西,因此如果你告诉计算机使用更高的精度,你会得到舍入误差(在这种情况下,最后的
1110

这实际上是同一个问题。从优秀社区wiki中,您可以找到以下答案:

所有的数学都是这样的,都是以数学为基础的。JavaScript使用64位浮点表示,这与Java的
double
相同


问题作者:

我在ECMA脚本规范中找到了答案:

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

The least significant digit of s is not always uniquely determined by the requirements listed in step 5.
和这里的一样:


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

如有疑问,请参考标准:?@dcorder“对于某些值,toFixed的输出可能比toString更精确,因为toString只打印足够的有效数字来区分数字和相邻的数值”,谢谢,我想这回答了我的问题。我很熟悉浮点算法的工作原理。我的问题是,为什么有些数字在某些情况下显示,而在其他情况下不显示。正如示例代码的最后一行所示,显然0.2不是计算机的最佳估计。我可能不太清楚。当你做算术时,比如
0.1+0.2
,或者当你使用
.toFixed()
时,你强迫计算机放弃它使用的固定小数位数。因此,
0.2
可能是
0.2
,但是
0.1+0.2
使计算机“忘记”它应该只使用1位小数来显示答案<实际上,code>0.2是计算机对
0.2
的最佳估计,因为它可以“记住”何时停止计算额外的数字。但是,在本机级别上,当您对该数字执行浮点运算时,它还不够复杂。这不是javascript执行0.2+0.2和(0.2+0.2)的方式。toFixed(20)@Ed Cottrel看起来你没有仔细阅读这个问题,你只是回答了一个被问了无数次的问题——浮点数是如何实现的。这里要问的问题是为什么:javascript:0.300000000004计算为0.300000000004,而javascript:0.300000000001计算为0。3@EdCottrell下面是一个没有任何算术运算的示例:'>x=0.300000000000000004441;0.300000000004>x.toFixed(20)0.300000000000000004441//精度最高不超过20位,数字四舍五入为17位。>x=0.200000000000000001110;0.2>x.toFixed(20)0.200000000001110//20位以内精度无损失,但数字未四舍五入到17位,即0.2000000000001,而是四舍五入到16位或更少。”
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.