背景
我正在做一个函数,接收一个正数,然后将数字四舍五入到最接近的整数。
我一直在使用 Math.floor
,但是最近我发现了 Math.trunc
。
我知道,给定一个正数,两者将返回相同的值,并且它们以完全不同的方式工作。我有兴趣探索这种行为。
问题
最佳答案
实际上,还有很多其他方法可以从数字中删除小数。但这是可读性和速度之间的权衡。
选择合适的一个取决于您的需求。如果只需要除去小数点,请始终使用trunc()
或按位运算符。floor()
,ceil()
和round()
在概念上与trunc()
有很大不同。
数学库
您已经知道这些。始终以标准的非关键代码使用它们。
var v = 3.14;
[Math.trunc(v), Math.floor(v), Math.ceil(v), Math.round(v)]
// prints results
对于不同的输入值,您可以获得这些结果
t f c r
3.87 : [ 3, 3, 4, 4]
3.14 : [ 3, 3, 4, 3]
-3.14 : [-3, -4, -3, -3]
-3.87 : [-3, -4, -3, -4]
但这更有趣:)
二进制运算和bitwise operators
如果您在代码中查看它们,乍一看可能看不到它们的作用,所以不要在普通代码中使用它们。尽管在某些情况下,它们可能有用。例如,计算
<canvas/>
中的坐标。它们速度更快,但有局限性。从概念上讲,它们是这样工作的:
按位逻辑运算符
按位移位运算符
value
和位位置的number
来移位value
。 chop
但是,在 chop 时,我们总是使用
0
,零,一个false
作为第二个操作数,在这种情况下,除了转换为整数外,它对原始值没有任何作用:~
否~~v
|
或OR 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
关于javascript - Math.floor VS Math.trunc JavaScript,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38702724/