x|0 如何在 JavaScript 中对数字进行底数计算?

IT技术 javascript numbers integer floor
2021-02-08 03:12:34

在我之前的问题(在 javascript 中生成随机整数的最快方法是什么?的公认答案中,我想知道一个数字是如何通过符号丢失小数的|

例如:

var x = 5.12042;
x = x|0;

那楼数怎么来的5

还有一些例子:

console.log( 104.249834 | 0 ); //104
console.log( 9.999999 | 0 );   // 9
3个回答

因为,根据 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)Result(6)结果是一个有符号的 32 位整数

  8. 返回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')

s/Most (.*?) don't/Strongly typed \1 generally don't/ (然而,这非常依赖于语言。)
2021-03-28 03:12:34

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

在保留数据类型的同时执行此操作的更好方法是将exponent数字转入mantissa并将其余位归零。

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