在我之前的问题(在 javascript 中生成随机整数的最快方法是什么?)的公认答案中,我想知道一个数字是如何通过符号丢失小数的|
。
例如:
var x = 5.12042;
x = x|0;
那楼数怎么来的5?
还有一些例子:
console.log( 104.249834 | 0 ); //104
console.log( 9.999999 | 0 ); // 9
在我之前的问题(在 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)和Result(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数字转入mantissa并将其余位归零。
如果您有兴趣,可以查看浮点数的IEEE 规范。