实际上,还有更多替代方法可以从数字中删除小数。但这是可读性和速度的权衡。
选择合适的取决于您的需求。如果您只需要删除小数,请始终使用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() 删去 (截断)小数位。
Math.round() 四舍五入向最近的 strong> 整数。
Math.floor() 四舍五入向最接近的较低整数。 3.5 -> 3-3.5 -> -4
Math.ceil()四舍五入向最接近的更高整数。 3.5 -> 4-3.5 -> -3
但这更有趣:)
如果您在代码中查看它们,乍一看它们的作用可能并不明显,因此不要在普通代码中使用它们。尽管在某些情况下,它们可能很有用。例如计算<canvas/> 中的坐标。它们速度更快,但也有局限性。
从概念上讲,它们是这样工作的:
- 操作数被转换为 32 位有符号整数,因此会丢失所有小数。
注意:
超过 32 位的数字得到它们的最高有效(最左边)位discarded,最左边的位成为新的符号位。
[
0b011100110111110100000000000000110000000000001, // 15872588537857
~~0b011100110111110100000000000000110000000000001, // -1610588159
~~0b10100000000000000110000000000001, // -1610588159
]
位逻辑运算符
- 第一个操作数中的每个位都与第二个操作数中的相应位配对。 (第一位到第一位,第二位到第二位,依此类推。)
- 将运算符应用于每对位,并按位构造结果。
位移运算符
- 这些运算符采用要移位的
value 和位位置的number 将value 移位。
截断
但是,在截断时,我们总是使用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