inkFly 的《JavaScript - 如果... 没有方法》中提及如何手写 Math.round 方法,各种奇技淫招看着十分过瘾,最让我惊叹的是 ~~(x + 0.5 + (x >> 30)) ,完全通过加法和位运算搞定整数的四舍五入。在好奇心的驱使下重温了一下位运算,并对上述公式加以封装得到适合小数的四舍五入方法 function round(v/*alue*/, p/*recision*/){ p = Math.pow(10, p>>>31 ? 0 : p|0) v *= p return (v + 0.5 + (v>>31)|0) / p } 在开波前我们先要了解一个现实,那就是虽然 JS 仅有 Number 这个数值类型,并且 Number 底层采用 IEEE 754 64bit Double precision floating-point 编码,但 JS 中实际上还是存在 Signed Int32、Unsigned Int32 和 Unsigned Int16 的数值编码方式,只是它们仅存在于运算过程中而已,而按位运算则是其中之一。