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