x|0 如何对 JavaScript 中的数字进行下限?

Posted

技术标签:

【中文标题】x|0 如何对 JavaScript 中的数字进行下限?【英文标题】:How does x|0 floor the number in JavaScript? 【发布时间】:2012-02-21 09:49:21 【问题描述】:

在我之前的问题的已接受答案中 (What is the fastest 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

【问题讨论】:

您应该知道,使用按位运算符会将您限制为 32 位有符号整数。 ((Math.pow(2,32)/2)-1)|0; // 2147483647 删除 -1 你不会得到想要的结果。 ((Math.pow(2,32)/2))|0; // -2147483648 有趣。这可能是这个函数比Math.floor(x) 函数稍快的原因。 jsperf.com/floor-or-or 它实际上不是“地板”,试试-1.23 看看会发生什么 【参考方案1】:

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

见11.10 Binary Bitwise Operators:

产生式A : A @B,其中@ 是 上面的产品,评估如下:

    评估A

    致电GetValue(Result(1))

    评估B

    致电GetValue(Result(3))

    致电ToInt32(Result(2)).

    致电ToInt32(Result(4)).

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

    返回Result(7)

【讨论】:

【参考方案2】:

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

$ python -c "1.0|0" 回溯(最近一次通话最后): 文件“”,第 1 行,在 TypeError:不支持的操作数类型|:'float'和'int' $ ruby​​ -e '1.0|0' -e:1:in `': 未定义的方法 `|'对于 1.0:Float (NoMethodError) $ echo "int main()1.0|0;" | gcc -xc - :在函数“主”中: :1: 错误:二进制操作数无效 | (有‘double’和‘int’)

【讨论】:

s/Most (.*?) don't/Strongly typed \1 generally don't/(不过,这非常依赖于语言。)【参考方案3】:

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

在保留数据类型的同时,更好的方法是将 exponent 数字转到 mantissa 并将剩余位归零。

如果您有兴趣,可以查看 IEEE spec 以获取浮点数。

【讨论】:

以上是关于x|0 如何对 JavaScript 中的数字进行下限?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 数组中对格式项目进行编号

如何对数字的javascript数组进行排序[重复]

如何在javascript中对字母数字数组进行排序[重复]

将一个数组中的数字与另一个数组 Javascript 的索引进行比较

使用 Javascript 使用 for 循环对数组中的数字求和 [重复]

如何进行数字图像处理中的膨胀和腐蚀计算