11

在我之前的问题(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
4

3 回答 3

16

因为,根据 ECMAScript 规范,按位运算符运算符调用ToInt32要计算的每个表达式。

请参阅11.10 二进制位运算符

产生A : A @B@是上述产生式中的位运算符之一,其评估如下:

  1. 评估A

  2. 打电话GetValue(Result(1))

  3. 评估B

  4. 打电话GetValue(Result(3))

  5. 称呼ToInt32(Result(2)).

  6. 称呼ToInt32(Result(4)).

  7. 将位运算符@应用于Result(5)and Result(6)结果是一个有符号的 32 位整数

  8. 返回Result(7)

于 2012-01-28T23:56:53.347 回答
5

按位运算符将其参数转换为整数(请参阅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')

于 2012-01-28T23:54:53.283 回答
2

在执行 a 时floor,虽然可以将参数转换为整数,但这不是大多数语言会做的事情,因为原始类型是浮点数。

在保留数据类型的同时做到这一点的更好方法是将exponent数字放入 themantissa并将剩余位归零。

如果您有兴趣,可以查看IEEE浮点数规范。

于 2012-01-28T23:59:06.400 回答