在我之前提出的问题的答案中
(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
答案 0 :(得分:13)
因为根据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)
。
答案 1 :(得分:5)
按位运算符将其参数转换为整数(请参阅http://es5.github.com/#x9.5)。 大多数语言我知道不支持这种转换:
$ python -c "1.0|0" Traceback (most recent call last): File "", line 1, in TypeError: unsupported operand type(s) for |: 'float' and 'int' $ ruby -e '1.0|0' -e:1:in `': undefined method `|' for 1.0:Float (NoMethodError) $ echo "int main(){1.0|0;}" | gcc -xc - : In function ‘main’: :1: error: invalid operands to binary | (have ‘double’ and ‘int’)
答案 2 :(得分:2)
在执行floor
时,尽管可以将参数转换为整数,但这并不是大多数语言所能做的,因为原始类型是浮点数。
在保留数据类型的同时更好的方法是将exponent
数字转到mantissa
并将剩余的数字归零。
如果您有兴趣,可以查看IEEE spec的浮点数。