是浮点数| 0 =固定数字?

时间:2018-05-22 06:56:24

标签: javascript

假设我编写了如下代码:

console.log((5/3)|0)

结果是1.

但为什么呢?在我看来,|0表示+0。但为什么它可以取消小数部分?

任何人都可以通过显示其内部二进制数字来完全理解这一点,我如何逐步获得该结果?

2 个答案:

答案 0 :(得分:3)

这里,运算符|是按位OR,并涉及分析计算机内部存储的浮点数。这是因为所有浮点数实际上都表示为32位。

0的所有32位都等于010位OR 0仍然分别为10,因此所有32位保持不变。

通常,所有JS编号都是双精度数(64位浮点数)。请注意,在按位OR完成之前,JS编译器将转换浮点操作数暂时转换为其 signed int 形式,这意味着它可能导致不同的值,特别是截断小数部分。在按位操作完成后,JS会将其转换回浮点数。

以下是按位OR后如何将float值截断为signed int的示例:

var x = 100/3.0;
console.log(x);   // outputs 33.333333333333336
console.log(x|0); // outputs 33 (no decimal)

您的按位运算符如何逐步运行

There is a Mozilla documentation about the Javascript bitwise operators.

  

"所有位运算符的操作数都以2的补码格式转换为带符号的32位整数。"

一步一步,这些位是(为了简洁,让它们是单精度浮点数,JS小数是双倍的):

  • 100 / 3: 0 10000100 0000101 01010101 01010101
    • 指数位为132,为5无偏,尾数位略大于1
  • 100 / 3在按位OR之前被转换为32位int形式,产生整数33
  • 33 : 0000 0000 0000 0000 0000 0000 0010 0001
  • 0 : 0000 0000 0000 0000 0000 0000 0000 0000
  • 33 | 0 : 0000 0000 0000 0000 0000 0000 0010 0001再次产生整数33。
  • 按位操作完成后,33将转换回浮点。

答案 1 :(得分:1)

5/3

1.6666666666666667

但是,正如对该问题的评论中所指出的,按位运算符(如|)将其参数转换为带符号的32位整数。这个截断到零小数位。

因此

(5/3)|0

变为1|0,即1

(#34的中间运算符;将浮点数截断为整数"无法在JS中显示,为了看到在运行中你需要类似C的东西,你可以明确地执行这些操作。)