# 截尾取整

# 简介

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)