JavaScript 中 x|0 如何对数字进行取整?

发布于 2024-12-29 10:36:19 字数 423 浏览 3 评论 0原文

在我之前的问题的接受答案中 ( 最快的生成方式是什么javascript 中的随机整数? ),我想知道数字如何通过符号 | 丢失小数位 。

例如:

var x = 5.12042;
x = x|0;

如何将数字降至 5

更多示例:

console.log( 104.249834 | 0 ); //104
console.log( 9.999999 | 0 );   // 9

In the accepted answer on my earlier question
( What is the fastest way to generate a random integer in javascript? ), I was wondering how a number loses its decimals via the symbol |
.

For example:

var x = 5.12042;
x = x|0;

How does that floor the number to 5?

Some more examples:

console.log( 104.249834 | 0 ); //104
console.log( 9.999999 | 0 );   // 9

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

茶色山野 2025-01-05 10:36:19

因为,根据 ECMAScript 规范,按位运算符对每个要计算的表达式调用 ToInt32

请参阅11.10 二元按位运算符

产生式A : A @B,其中@是按位运算符之一
以上作品,评价如下:

  1. 评估A

  2. 调用GetValue(Result(1))

  3. 评估B

  4. 调用GetValue(Result(3))

  5. 调用ToInt32(Result(2))。

  6. 调用ToInt32(Result(4))。

  7. 将按位运算符@应用于Result(5)Result(6)结果是一个带符号的 32 位整数

  8. 返回结果(7)

Because, according to the ECMAScript specifications, bitwise operators call ToInt32 on each expression to be evaluated.

See 11.10 Binary Bitwise Operators:

The production A : A @B, where @ is one of the bitwise operators in
the productions above, is evaluated as follows:

  1. Evaluate A.

  2. Call GetValue(Result(1)).

  3. Evaluate B.

  4. Call GetValue(Result(3)).

  5. Call ToInt32(Result(2)).

  6. Call ToInt32(Result(4)).

  7. Apply the bitwise operator @ to Result(5) and Result(6). The result is a signed 32 bit integer.

  8. Return Result(7).

肩上的翅膀 2025-01-05 10:36:19

位运算符将其参数转换为整数(请参阅 http://es5.github.com/#x9.5< /a>)。
我知道的大多数语言都不支持这种类型的转换:

    $ 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’)

Bitwise operators convert their arguments to integers (see http://es5.github.com/#x9.5).
Most languages I know don't support this type of conversion:

    $ 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’)

り繁华旳梦境 2025-01-05 10:36:19

在执行向下取整时,虽然可以将参数转换为整数,但这不是大多数语言会执行的操作,因为原始类型是浮点数。

在保留数据类型的同时,更好的方法是将指数数字放入尾数并将剩余位归零。

如果您有兴趣,可以查看浮点数的 IEEE 规范

When doing a floor, although it would be possible to convert the argument to an integer, this is not what most languages would do because the original type is a floating-point number.

A better way to do it while preserving the data type is to go to exponent digits into the mantissa and zero the remaining bits.

If you're interested you can take a look at the IEEE spec for floating point numbers.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文