~~和Math.floor()的区别

7

我在示例中看到,~~Math.floor 的功能是相同的。它们都将一个数字向下舍入(我的理解是正确的吗?)

此外,根据这个测试,~~Math.floor 更快:jsperf.com/math-round-vs

所以我想知道,~~Math.floor 之间有什么区别吗?


可能是JavaScript中的“双波浪线”(~~)运算符是什么?的重复问题。 - Tomasz Nurkiewicz
2个回答

15

是的,位运算符通常不适用于负数。例如:

~~-6.8 == -6 // doesn’t round down, simply removes the decimals

Math.floor(-6.8) == -7

您也会得到0而不是NaN,例如:

~~'a' == 0

Math.floor('a') == NaN

你也可以使用 ~~n - (n < 0),但这只是残忍的做法。 - Blender
如果你想朝零舍入而不是向下舍入,它对负数的处理效果很好,这是我经常遇到的问题... - Myndex

8
除了David的答案之外:
我注意到JavaScript位运算在小值方面非常方便,但不一定适用于大值。原因在于,位运算符仅对完全在32位有符号格式中表示的操作数完全有效。换句话说,使用位运算将只产生在-2147483648(- 231)到2147483647(231-1)范围内的数字。此外,如果使用的操作数之一超出该范围,则将使用该数字的最后32位而不是指定的数字。
这种限制在处理日期时很容易发现,例如假设您要舍入毫秒值:
Math.floor(1559125440000.6) // 1559125440000
~~1559125440000.6           // 52311552

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接