# 截尾取整
# 简介
trunc 是一个抹掉数字小数位的功能函数
# Python 中的 trunc
import math
print(math.trunc(2.77))
print(math.trunc(8.32))
print(math.trunc(-0))
print(math.trunc(-9.99))
# print(math.trunc(math.inf)) error
2
8
0
-9
# JS 实现
const trunc = (x) => {
return x >= 0 ? Math.floor(x) : Math.ceil(x)
}
如果这么写,和高斯函数的实现造成循环引用了。这里有一些奇技淫巧 (opens new window)。但在工程上我不推荐,因为这样会让代码变得难读,语义不够明确。特别是用位运算取整,要注意溢出风险:
4294967296.1 | 0 // 0
~~4294967296.1 // 0
Math.trunc(4294967296.1) // 4294967296
模 1 不是奇技淫巧,我们可以用模运算实现一个符合 JS 规范的 trunc:
const trunc = (x) => {
x = +x
if (!isFinite(x)) return x
if (Object.is(x, -0)) return x
const dec = x % 1
const int = x - dec
if (x < 0 && int === 0) return -0
return int
}
// 0 -> 0
// -0 -> -0
// 0.2 -> 0
// -0.2 -> -0
// 0.7 -> 0
// -0.7 -> -0
// Infinity -> Infinity
// -Infinity -> -Infinity
// NaN -> NaN
// null -> 0
// 2.7 -> 2
// -2.3 -> -2
关于 Math.trunc 的相关话题,可以在这里留言 (opens new window)