在什么时候比较“整数”和“浮点数”等于“ true”?

时间:2019-08-14 07:05:21

标签: javascript floating-point precision

我了解Number.MAX_SAFE_INTEGERNumber.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

3 个答案:

答案 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吗? 。

由于任何计算机都可以存储无限数量,所以没有最大安全浮点数。