【问题标题】:Is any float number | 0 = a fixed number?是任何浮点数| 0 = 固定数?
【发布时间】:2018-10-31 20:39:29
【问题描述】:

假设我编写了如下代码:

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

结果是1。

但是为什么?在我看来,|0 意味着+0。但是为什么可以取消小数部分呢?

谁能通过显示它的内部二进制数字来让我完全理解它,我怎样才能一步一步地得到这个结果?

【问题讨论】:

  • 您确定要对浮点值进行按位运算吗?这通常效果不佳。
  • 我只是想知道为什么?如果您不知道或不想回答我的问题,则给出负分是不公平的……:(如果您有空闲时间,可以玩一下……您注意到了吗?
  • Bitwise operators[...]The operands of all bitwise operators are converted to signed 32-bit integers in two's complement format.[...]
  • 有人否决了您的问题可能有很多原因(不是我),idownvotedbecau.se 列出了一些更突出的原因。我还建议您read about how to ask good questions,学习如何创建Minimal, Complete, and Verifiable Example,并阅读this SO question checklist,以确保您有一个好的问题。
  • 您的问题对我来说看起来不错,但抱怨反对票会让人们三思而后行。

标签: javascript numbers bitwise-operators arithmetic-expressions


【解决方案1】:

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

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

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

这是一个浮点值如何在按位或之后被截断为有符号整数的示例:

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.

“所有位运算符的操作数都转换为二进制补码格式的有符号 32 位整数。”

逐步,位是(为简洁起见,让它们成为单精度浮点数,JS小数是双精度数):

  • 100 / 3: 0 10000100 0000101 01010101 01010101
    • 指数位为132,无偏为5,尾数位略大于1
  • 100 / 3 在按位或之前被转换为 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 转换回浮点数。

【讨论】:

    【解决方案2】:
    5/3
    

    1.6666666666666667

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

    因此

    (5/3)|0
    

    变为1|0,即1

    (“将浮点数截断为整数”的中间运算符无法在 JS 中显示,以了解实际操作中您需要类似 C 的东西,您可以在其中显式执行此类操作。)

    【讨论】:

    • 它似乎是这样工作的(截断),但它是在某处指定的还是只是 js 引擎的内部机制?我找不到任何关于此的正式声明。
    • 您还没有向询问者提供有关这些位是如何一步一步进行的。
    • @Mulliganaceous 没有深入了解无法完成的 IEEE 浮点格式(不会增加任何价值)的细节。 (我看到你已经这样做了......但避免了整数转换所需的位精确细节。)
    • @MatusDubrava 它将在 EcmaScript 规范中。
    猜你喜欢
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 2014-10-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-09
    相关资源
    最近更新 更多