JavaScript 中 x|0 如何对数字进行取整?

问题描述 投票:0回答:3

在我之前的问题的已接受答案中 (在javascript中生成随机整数的最快方法是什么?),我想知道数字如何通过符号

|
失去小数位 .

例如:

var x = 5.12042;
x = x|0;

如何将数字增加到

5

更多示例:

console.log( 104.249834 | 0 ); //104
console.log( 9.999999 | 0 );   // 9
javascript numbers integer floor
3个回答
17
投票

因为,根据 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)


5
投票

按位运算符将其参数转换为整数(请参阅http://es5.github.com/#x9.5)。 大多数语言我知道不支持这种类型的转换:

 $ python -c "1.0|0"
    回溯(最近一次调用最后一次):
      文件“”,第 1 行,位于
    类型错误:| 不支持的操作数类型:“float”和“int”

    $ ruby -e '1.0|0'
    -e:1:在`'中:未定义的方法`|'对于 1.0:浮动(无方法错误)

    $ echo "int main(){1.0|0;}" |海湾合作委员会-xc-
    :在函数“main”中:
    :1: 错误:二进制操作数无效 | (有“double”和“int”)


2
投票

在执行

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

在保留数据类型的同时,更好的方法是将

exponent
数字放入
mantissa
并将剩余位归零。

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

© www.soinside.com 2019 - 2024. All rights reserved.