在什么情况下,整数和浮点数之间的比较等于‘真’?

2022-04-10 00:00:00 floating-point precision javascript

我了解Number.MAX_SAFE_INTEGERNumber.MIN_SAFE_INTEGER

我知道Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2等于True。

但我最近才意识到:

数据-lang="js"数据-隐藏="假"数据-控制台="真"数据-巴贝尔="假">
var number = 2007199254740991;
var float  = 2007199254740991.123;

console.log(number === float);
// => true

但是

数据-lang="js"数据-隐藏="假"数据-控制台="真"数据-巴贝尔="假">
var number = 1007199254740991;
var float  = 1007199254740991.123;

console.log(number === float);
// => false

所以我的问题是,我们如何找到"最大安全浮动"?

编辑

我的问题:

在什么情况下,"整型"和"浮点型"之间的比较等于true


解决方案

询问何时比较失败是错误的问题。比较两个数字始终正确;如果且仅当要比较的两个数字具有相同的值,则计算结果为TRUE。

该问题实际上发生在以前的操作中。将源代码中的数字转换为Number、加法和其他操作会在将精确的实数数学值舍入为可用浮点表示的值时引入错误。

JavaScript使用IEEE-754二进制64位,它有一个53位有效数(浮点数的小数部分)。这意味着幅值为252或更大的任何数字没有任何位可以表示小于1的值-它们没有小数部分。因此,当将任何252或更大的数字转换为JavaScriptNumber时,结果是一个整数。

但较小的数字也会四舍五入。从251到252,可用的最低有效位表示2−1,即1/2。因此,在此间隔内转换为Number的任何数字都必须产生一个整数或一个整数加1/2。这意味着某些数字(如2251799813685248.6)将产生非整数(2251799813685248.5),而其他数字(如2251799813685248.8将产生整数(2251799813685249)。

低于252的每个震级,有些数字在转换为Number时将舍入为整数,而有些数字不会舍入为整数。(在252以上,所有数字都舍入为整数。)在较小的幅度下,只有更接近整数的数字才会舍入为整数-随着幅度的减小,格式会变得更加"敏感"。

相关文章