gpt4 book ai didi

javascript - Math.floor VS Math.trunc JavaScript

转载 作者:可可西里 更新时间:2023-11-01 01:45:52 26 4
gpt4 key购买 nike

背景

我正在制作一个函数,该函数接收一个正数,然后将该数字四舍五入为最接近它的整数。

我一直在使用Math.floor , 但最近我发现 Math.trunc .

我知道如果给定一个正数,两者都会返回相同的值,而且它们的工作方式完全不同。我有兴趣探索这种行为。

问题

  1. 哪个更快?
  2. 我应该使用哪一个?

最佳答案

实际上,有更多的替代方法可以从数字中删除小数点。但这是可读性和速度的折衷。

根据您的需要选择合适的。如果您只需要删除小数,请始终使用 trunc()或按位运算符。
floor() , ceil()round()在概念上与 trunc() 非常不同.

数学图书馆

这些你已经知道了。始终在标准的非关键代码中使用它们。

var v = 3.14; [Math.trunc(v), Math.round(v), Math.floor(v), Math.ceil(v)]
// prints results

对于不同的输入值,您会得到这些结果

 v        t   r   f   c
3.87 : [ 3, 4, 3, 4]
3.14 : [ 3, 3, 3, 4]
-3.14 : [-3, -3, -4, -3]
-3.87 : [-3, -4, -4, -3]

Math.trunc() 切掉( chop )小数位。
Math.round() 舍入最接近整数。
Math.floor() 舍入到最接近的较低整数。 3.5 -> 3 -3.5 -> -4
Math.ceil() 舍入到最接近的较高整数。 3.5 -> 4 -3.5 -> -3


但这更有趣:)

二元运算和bitwise operators

如果您在代码中查看它们,乍一看它们的作用可能并不明显,因此不要在正常代码中使用它们。尽管在某些情况下,它们可能会有用。例如计算 <canvas/> 中的坐标.它们要快得多,但也有局限性。

从概念上讲,它们是这样工作的:

  • 操作数转换为 32 位有符号整数,因此会丢失所有小数部分。

ATTENTION:
Numbers with more than 32 bits get their most significant (leftmost) bits discarded and the leftmost bit becomes the new sign bit.

[
0b011100110111110100000000000000110000000000001, // 15872588537857
~~0b011100110111110100000000000000110000000000001, // -1610588159
~~0b10100000000000000110000000000001, // -1610588159
]

位逻辑运算符

  • 第一个操作数中的每一位都与第二个操作数中的相应位配对。 (第一位到第一位,第二位到第二位,依此类推。)
  • 运算符应用于每一对位,结果按位构造。

位移运算符

  • 这些运算符采用 value被转移和一个number移动 value 的位位置由。

chop

但是,在 chop 时,我们总是使用 0 ,零,一个false作为第二个操作数,除了转换为整数外,它不会对原始值做任何事情,在这些情况下:

~不是 ~~v

|或者 v | 0

<<左移 v << 0

>>有符号右移 v >> 0

>>>零填充右移 v >>> 0

var v = 3.78;
[ ~~v , v | 0 , v << 0 , v >> 0 , v >>> 0 ]
// prints these results

3.78 : [ 3, 3, 3, 3, 3]
3.14 : [ 3, 3, 3, 3, 3]
-3.74 : [-3, -3, -3, -3, 4294967293]
-3.14 : [-3, -3, -3, -3, 4294967293]

性能

https://jsperf.com/number-truncating-methods/1

enter image description here

关于javascript - Math.floor VS Math.trunc JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38702724/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com