我了解Number.MAX_SAFE_INTEGER
和Number.MIN_SAFE_INTEGER
。
我了解Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2
等于真。
但是我直到最近才意识到:
var number = 2007199254740991;
var float = 2007199254740991.123;
console.log(number === float);
// => true
但是
var number = 1007199254740991;
var float = 1007199254740991.123;
console.log(number === float);
// => false
所以我的问题是,我们如何找到“最大安全浮动”?
编辑
我的问题:
什么时候比较“整数”和“浮点数”等于true
?
答案 0 :(得分:3)
没有这样的事情,因为Javascript数字的精度有限或有效数字有效。
const n1 = 1e-10;
const n2 = 1e-30;
console.log(n1 - n2 === n1);
与1e-10
之类的非常小的数字结合使用远小于它的数字时,其行为也不精确。您的代码段也发生了同样的事情-〜1e15
(接近1007199254740991
的值)与0.123
相比太大了。
还有著名的不精确0.1 + 0.2:
console.log(0.1 + 0.2);
除了有效限制有效位数外,不能用二进制精确表示的数字也会出现这种问题。
答案 1 :(得分:2)
比较失败时询问是错误的问题。比较两个数字始终可以正确进行;当且仅当被比较的两个数字具有相同的值时,它的计算结果为true。
该问题实际上发生在较早的操作中。将精确的实数数学值四舍五入为浮点可表示的值时,将源代码中的数字转换为Number
,加上数字,以及其他操作会引入错误。
JavaScript使用IEEE-754 binary64,它具有53位有效数字(浮点数的小数部分)。这意味着任何数量级为2 52 的数字都没有任何比特可以表示小于1的值-它们没有分数部分。因此,将任何2 52 或更大的数字转换为JavaScript Number
时,结果都是整数。
但是较小的数字也会四舍五入。从2 51 到2 52 ,可用的最低有效位表示2 -1 或½。因此,此间隔中任何转换为Number
的数字都必须产生整数或整数加½。这意味着某些数字(例如225179981368368524 8.6 )将产生非整数(225179981368368524 8.5 ),而其他数字(例如225179981368524 8.8 )将产生整数( 225179981368524 9 )。
在低于2 52 的每个量级上,有些数字在转换为Number
时会四舍五入为整数,而某些数字不会四舍五入为整数。 (在2 52 上,所有数字都四舍五入为整数。)在较小的数量级上,仅将更接近整数的数字四舍五入为整数-随着幅度减小,格式变得更“敏感”。
答案 2 :(得分:0)
在JavaScript中找不到“最大安全浮动”。它根本不存在。
@CertainPerformance是正确的,JS中的精度有限。此外,请记住编程语言中的数字是按0或1位存储的,并且请记住您可以有无限的小数,因此...您可以有无限的0和1吗? 。
由于任何计算机都可以存储无限数量,所以没有最大安全浮点数。