我的一个同事偶然发现了一个方法,使用位浮点数或:

var a = 13.6 | 0; //a == 13

我们一直在讨论这件事,想知道一些事情。

它是如何工作的?我们的理论是使用这样的运算符将数字转换为整数,从而去掉小数部分 它比math。floor有什么优势吗?也许会快一点?(并非有意双关语) 它有什么缺点吗?也许在某些情况下它不起作用?清晰是显而易见的,因为我们必须弄清楚,好吧,我在写这个问题。

谢谢。


当前回答

它是如何工作的?我们的理论是使用这样的运算符转换 将数字改为整数,从而去掉小数部分

除无符号右移>>>外,所有的位操作都适用于有符号的32位整数。因此,使用位操作将浮点数转换为整数。

它比math。floor有什么优势吗?也许有点 更快呢?(并非有意双关语)

http://jsperf.com/or-vs-floor/2似乎快一点

它有什么缺点吗?也许在某些情况下它不起作用? 清晰度是显而易见的,因为我们必须弄清楚, 我在写这个问题。

不会传递jsLint。 仅32位有符号整数 奇数比较行为:Math.floor(NaN) === NaN,而(NaN | 0) === 0

其他回答

你的第一点是正确的。该数字被转换为整数,因此任何十进制数字都被删除。请注意,数学。下一个整数舍入到负无穷,因此当应用于负数时,会给出不同的结果。

它是如何工作的?我们的理论是使用这样的运算符转换 将数字改为整数,从而去掉小数部分

除无符号右移>>>外,所有的位操作都适用于有符号的32位整数。因此,使用位操作将浮点数转换为整数。

它比math。floor有什么优势吗?也许有点 更快呢?(并非有意双关语)

http://jsperf.com/or-vs-floor/2似乎快一点

它有什么缺点吗?也许在某些情况下它不起作用? 清晰度是显而易见的,因为我们必须弄清楚, 我在写这个问题。

不会传递jsLint。 仅32位有符号整数 奇数比较行为:Math.floor(NaN) === NaN,而(NaN | 0) === 0

规范说它被转换成一个整数: 设lnum为ToInt32(lval)。 性能:这已经在jsperf中测试过了。

注意:到规范的死链接已删除

在ECMAScript 6中,相当于|0的是Math。trunc,我应该说

通过删除任何小数,返回数字的整部分。它只是截断点和它后面的数字,不管参数是正数还是负数。

Math.trunc(13.37)   // 13
Math.trunc(42.84)   // 42
Math.trunc(0.123)   //  0
Math.trunc(-0.123)  // -0
Math.trunc("-1.123")// -1
Math.trunc(NaN)     // NaN
Math.trunc("foo")   // NaN
Math.trunc()        // NaN

这是截断,而不是叠加。霍华德的回答是正确的;但我要补充的是数学。对于负数,它做的就是它应该做的。从数学上讲,这就是地板。

在上面描述的情况中,程序员更感兴趣的是截断或将小数点完全砍掉。尽管,他们使用的语法掩盖了他们将浮点数转换为int型的事实。