JavaScript中的地板编号:~~ n,n | 0或Math.floor(n)?

时间:2012-06-05 01:30:04

标签: javascript integer

我最近发现了除Math.floor(n)以外的JavaScript中删除数值的小数部分的其他方法,特别是双位NOT运算符~~n并执行按位或0 {{1 }}

我想知道这些方法之间的区别,以及推荐一种方法与另一种方法的不同情况。

3 个答案:

答案 0 :(得分:6)

向下一位查看您的代码的人清楚并使用Math.floor()

The performance gain of 1%-40%并不值得,所以不要让代码混乱,难以维护。

答案 1 :(得分:5)

所有位运算符的操作数都转换为带符号的32位整数:

Math.floor(2147483648) // 2147483648
2147483648 | 0         // 2147483648
~~2147483648           // 2147483648

Math.floor(2147483649) // 2147483649
2147483649 | 0         // -2147483647
~~2147483649           // -2147483647

所以使用Math.floor();

答案 2 :(得分:2)

(我完全同意josh的回答:赞成明确的可维护代码。)

以下是对其他逐位方法的解释:

逐位运算符的工作原理是因为它们在32位(带符号)整数上仅运算符运算符,但JavaScript中的数字都是IEEE-754值。因此,对于按位运算符,操作数会发生内部转换(截断,而不是楼层!)。

应用逐位操作(例如n<<0~~nn|0)然后充当身份函数,对转换后“无效”值:也就是说,所有这些方法都依赖于应用于逐位操作数的相同转换。

尝试将n作为负数或超出[-2 31 ,2 31 -1]的值:

(-1.23|0)            // -1
Math.floor(-1.23)    // -2

var x = Math.pow(2, 40) + .5
x|0                  // 0
Math.floor(x)        // 1099511627776

快乐的编码。