JavaScript的trunc()函数

20

我想在JavaScript中截断一个数字,也就是去掉小数部分:

trunc ( 2.6 ) == 2

trunc (-2.6 ) == -2


通过严格的基准测试,我的答案是:

 function trunc (n) {
    return ~~n;
 }
 
 // or  

 function trunc1 (n) {
    return n | 0;
 }

5
请注意,位运算方法(如~~n或n|0)仅适用于小于2^31-1或2147483647的数字。2147483648或更高的数字将返回不正确的结果;例如,2147483647 | 0返回-2147483648,4294967295 | 0返回-1,这几乎肯定不是您想要的。 - Ed Bayiates
5个回答

34
作为对@Daniel答案的补充,如果你想要向零舍入,可以这样做:
function truncate(n) {
  return n | 0; // bitwise operators convert operands to 32-bit integers
}

或:
function truncate(n) {
  return Math[n > 0 ? "floor" : "ceil"](n);
}

两种方法都可以正确地处理正数和负数:

truncate(-3.25) == -3;
truncate(3.25) == 3;

13

对于正数:

Math.floor(2.6) == 2;

对于负数:

Math.ceil(-2.6) == -2;

10

您可以使用toFixed方法,该方法还允许指定要显示的小数位数:

var num1 = new Number(3.141592);
var num2 = num1.toFixed(); // 3
var num3 = num1.toFixed(2); // 3.14
var num4 = num1.toFixed(10); // 3.1415920000

请注意,toFixed会对数字进行四舍五入:

var num1 = new Number(3.641592);
var num2 = num1.toFixed(); // 4

1
四舍五入意味着不截断。另外请注意,toFixed返回一个字符串。 - Old Badman Grey

4

I use

function trunc(n){
   return n - n % 1;
}

由于它适用于整个浮点范围,而且速度(未经衡量)应该比其他更快。
function trunc(n) {
  return Math[n > 0 ? "floor" : "ceil"](n);
}

太棒了!你的方法只是稍微快一点,但它更加紧凑,这也对性能有影响。更好的是,我不必使用函数调用,我可以直接嵌入 (n - n % 1)!我一直在使用 (n | 0),但那只对小于32位大小的数字有效,而不是完整的64位浮点范围。从现在开始我会使用这个方法,谢谢! - Ed Bayiates

0
如果此前不可用,或者其他任何遇到此线程的人,现在可以直接使用 Math 库中的 trunc() 函数,示例如下:
let x = -201;
x /= 10;
console.log(x);
console.log(Math.trunc(x));

>>> -20.1
>>> -20

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接