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 中的数字进行下限?的主要内容,如果未能解决你的问题,请参考以下文章
将一个数组中的数字与另一个数组 Javascript 的索引进行比较