Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.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_Floating Point_Precision - Fatal编程技术网

Javascript中数字的奇怪问题 信息

Javascript中数字的奇怪问题 信息,javascript,floating-point,precision,Javascript,Floating Point,Precision,Number.MAX\u SAFE\u INTEGER=9007199254740991 问题 知道为什么会发生这种情况吗?因为浮点数的精度很低 简而言之:不要期望任何特定的浮点数与任何其他数字完全相等。是的,如果深入研究,您可能会发现这里到底发生了什么,但是当您违反了一个基本原则,即首先使用不准确的浮点时,为什么还要麻烦呢?我可以理解浮点操作(如加法)失败的原因。但为什么像平等这样的东西会失败呢(0.1+0.2)==0.3//false有意义。但不是这样。如果一个值不能用float精确表示,它

Number.MAX\u SAFE\u INTEGER=9007199254740991

问题
知道为什么会发生这种情况吗?

因为浮点数的精度很低


简而言之:不要期望任何特定的浮点数与任何其他数字完全相等。是的,如果深入研究,您可能会发现这里到底发生了什么,但是当您违反了一个基本原则,即首先使用不准确的浮点时,为什么还要麻烦呢?我可以理解浮点操作(如加法)失败的原因。但为什么像平等这样的东西会失败呢<代码>(0.1+0.2)==0.3//false有意义。但不是这样。如果一个值不能用float精确表示,它会捕捉到另一个可以表示的值。在这里,前两个数字取整为
10000000000
,这仅仅是因为试图表达它们。当十进制数字转换为JavaScript
数字时,结果是十进制数字表示的数字取整为最接近的浮点值。对于“9999999999999.99999”和“9999999999999.99999”,最接近的可表示值为10000000000。因此,源代码中的
9999999999.99999
变为10000000000,然后相等比较将10000000000与10000000000进行比较,因此返回true。在“9999999999999.9999”的情况下,最接近的值是99999999999.99987779296875,因此比较返回false。64位浮点数的精度高于32位整数。引起浮点舍入问题的不是精度本身,而是与人们期望的相比,它们的行为方式的本质。好吧,十进制是以10为基数的,而计算机是以2为基数的。也许我在使用精度这个术语时,自己的公式不正确。
1000000000000 === 999999999999.999999  // Gives output true
1000000000000 === 999999999999.99999   // Gives output true
1000000000000 === 999999999999.9999    // Gives output false