在我之前的问题(What is the faster way to generate a random integer in javascript?)的公认答案中,我想知道一个数字是如何通过符号丢失小数的|
。
例如:
var x = 5.12042;
x = x|0;
那个楼层的号码怎么来的5?
更多示例:
console.log( 104.249834 | 0 ); //104
console.log( 9.999999 | 0 ); // 9
在我之前的问题(What is the faster way to generate a random integer in javascript?)的公认答案中,我想知道一个数字是如何通过符号丢失小数的|
。
例如:
var x = 5.12042;
x = x|0;
那个楼层的号码怎么来的5?
更多示例:
console.log( 104.249834 | 0 ); //104
console.log( 9.999999 | 0 ); // 9
因为,根据 ECMAScript 规范,按位运算符运算符调用ToInt32要计算的每个表达式。
请参阅11.10 二进制位运算符:
产生
A : A @B式@是上述产生式中的位运算符之一,其评估如下:
评估
A。打电话
GetValue(Result(1))。评估
B。打电话
GetValue(Result(3))。称呼
ToInt32(Result(2)).称呼
ToInt32(Result(4)).将位运算符
@应用于Result(5)andResult(6)。结果是一个有符号的 32 位整数。返回
Result(7)。
按位运算符将其参数转换为整数(请参阅http://es5.github.com/#x9.5)。我知道的大多数语言都不支持这种类型的转换:
$ python -c "1.0|0"
回溯(最近一次通话最后):
文件“”,第 1 行,在
类型错误:| 不支持的操作数类型:'float' 和 'int'
$ ruby -e '1.0|0'
-e:1:in `': 未定义的方法 `|' 对于 1.0:Float (NoMethodError)
$ echo "int main(){1.0|0;}" | gcc -xc -
:在函数'main'中:
:1: 错误:二进制操作数无效 | (有'double'和'int')
在执行 a 时floor,虽然可以将参数转换为整数,但这不是大多数语言会做的事情,因为原始类型是浮点数。
在保留数据类型的同时做到这一点的更好方法是将exponent数字放入 themantissa并将剩余位归零。
如果您有兴趣,可以查看IEEE浮点数规范。