Javascript Integer Division,或者 Math.floor(x) 等同于 x | 0 表示 x >= 0?

标签 javascript division integer-division

看下面的例子,看起来 Math.floor(x) 等同于 x | 0,对于 x >= 0。真的是这样吗?如果是,为什么? (或者 x | 0 是如何计算的?)

x = -2.9; console.log(Math.floor(x) + ", " + (x | 0));   // -3, -2
x = -2.3; console.log(Math.floor(x) + ", " + (x | 0));   // -3, -2
x = -2;   console.log(Math.floor(x) + ", " + (x | 0));   // -2, -2
x = -0.5; console.log(Math.floor(x) + ", " + (x | 0));   // -1, 0
x = 0;    console.log(Math.floor(x) + ", " + (x | 0));   //  0, 0
x = 0.5;  console.log(Math.floor(x) + ", " + (x | 0));   //  0, 0
x = 2;    console.log(Math.floor(x) + ", " + (x | 0));   //  2, 2
x = 2.3;  console.log(Math.floor(x) + ", " + (x | 0));   //  2, 2
x = 2.9;  console.log(Math.floor(x) + ", " + (x | 0));   //  2, 2
x = 3.1;  console.log(Math.floor(x) + ", " + (x | 0));   //  3, 3

这对于在 Javascript 中执行整数除法很有用:(5/3) | 0 而不是 Math.floor(5/3)

最佳答案

按位运算符将数字转换为 32 位序列。因此,您建议的替代方案仅适用于带正符号的 32 位 float ,即从 0+2,147,483,647 的数字(2^31-1).

Math.floor(2147483646.4); // 2147483647
2147483646.4 | 0; // 2147483647
// but…
Math.floor(2147483648.4); // 2147483648
2147483648.4 | 0; // -2147483648

另一个区别:如果x不是数字,x |的结果0 可能与 Math.floor(x) 的不同。

Math.floor(NaN); // NaN
NaN | 0; // 0

除此之外,结果应该类似于Math.floor(),只要使用正数即可。

这里有一些例子+性能测试:http://jsperf.com/rounding-numbers-down

关于Javascript Integer Division,或者 Math.floor(x) 等同于 x | 0 表示 x >= 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9391718/

相关文章:

assembly - 为什么有必要在被 2 的幂的有符号除法的红利中添加偏差?

javascript - 如何通过选择其类使用 jquery 更改 anchor 标记

javascript - jqgrid 中带有自定义函数调用的超链接/按钮

c++ - MOD 运算是否比乘法更占用 CPU?

assembly - 8086 运行时 16 位除法溢出错误

c++ - 为什么将两个 int 分配给 double 时不能产生正确的值?

c - 除以零不会导致 Nvidia Jetson 运行时异常

javascript - Node 和 knex - 填充中间表 Promise 问题

javascript - 表格乘法

python - 此 Python 斐波那契数函数对于任何输入都会生成 0.0。我究竟做错了什么?