首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解释如何在JavaScript中使用二进制运算符将浮点数强制转换为整数

解释如何在JavaScript中使用二进制运算符将浮点数强制转换为整数
EN

Stack Overflow用户
提问于 2017-01-13 12:18:34
回答 4查看 79关注 0票数 0

在JavaScript中,整数值没有特殊类型。实际上,所有的数字都有一个Number类型,它是双精度浮点数(IEEE 754),即binary64。

JavaScript中的数值操作的一个问题是,标准中没有定义、整数除法、运算符或函数。

更新:实际上,有一个Math.trunc()函数,但是它的工作速度比二进制解决方案慢2-5倍,而且Internet不支持它。

可以使用一些二进制操作符来实现预期的结果,例如:

  • (10 / 4) >> 0
  • ~~(10 / 4)
  • (10 / 4) | 0

以上所有操作都会产生数字2,并且根据我的基准测试,在我的x64机器(Node.js v7.2.1)上具有类似的性能。

请您解释一下,这些二进制操作到底是如何实现这个目的的?有首选的吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-01-13 12:39:26

首先,将数字转换到带符号32位整数,这意味着与64位浮点表示相比,您丢失了一些数字。

您的数字的计算只是给出一个浮点值的2.5和操作数首先转换为一个有符号的32位整数,然后进行按位计算。操作数是必需的,因为您需要它来进行初始会话。

2 >> 0 >>的例子

代码语言:javascript
复制
     2 (base 10): 00000000000000000000000000000010 (base 2)
                  --------------------------------
2 >> 0 (base 10): 00000000000000000000000000000010 (base 2) = 2 (base 10)

~~2 ~的例子

代码语言:javascript
复制
     2 (base 10): 00000000000000000000000000000010 (base 2)
                  --------------------------------
    ~2 (base 10): 11111111111111111111111111111101 (base 2) = -3 (base 10)
                  --------------------------------
   ~~2 (base 10): 00000000000000000000000000000010 (base 2) =  2 (base 10)

2 | 0 |的例子

代码语言:javascript
复制
     2 (base 10): 00000000000000000000000000000010 (base 2)
     0 (base 10): 00000000000000000000000000000000 (base 2)
                  --------------------------------
 2 | 0 (base 10): 00000000000000000000000000000010 (base 2) = 2 (base 10)

除了将数字转换为整数表示的可能性之外,您还可以使用普通的Math.floor来实现同样的目的,这使得代码看起来并不神秘。

票数 1
EN

Stack Overflow用户

发布于 2017-01-13 12:43:22

这些操作不是将浮点转换为int的简单方法。这些是二进制操作,它工作在整数上。在这个过程中有自动转换。因此,这滥用了将浮点数转换为int的更快的方法。但是,由于这些操作经常在javascript中使用,所以使用它们并没有多大的害处。但是,Math.floor()或Math.truncate ()也可以用于更好的可读性。

票数 2
EN

Stack Overflow用户

发布于 2017-01-13 12:38:56

按位计算的运算符只处理Javascript中的整数,因此执行任何操作都会将值截断为整数。

代码语言:javascript
复制
(10 / 4) >> 0

执行除法(10 / 4)以获得值2.5,位移位(>>)只对整数值工作,因此通过在2.5上执行位移位,该值被截断为2。

情况也是如此。

代码语言:javascript
复制
(10 / 4) | 0

除了一点移位之外,这个操作是有点明智的。

代码语言:javascript
复制
~~(10 / 4)

执行双位方向的否定,第一个截断和否定使2.5变成-3,然后另一个将它转换回正确的符号,2。

您可以在这里阅读有关逐位运算符的更多信息:operators.asp

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41634509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档