在我之前的问题(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浮点数规范。