截断/整数在JavaScript中的整数?

对于我正在编写的脚本,我需要显示一个已经四舍五入的数字,但不是十进制或任何超过它的数字。 我已经得到了四舍五入到第三名,但我不知道如何去放弃小数和所有的东西,因为它似乎没有像PHP那样的substr函数。

任何build议?

如果你有一个string,把它parsing为一个整数:

 var num = '20.536'; var result = parseInt(num, 10); // 20 

否则,ECMAScript 6提供了Math.trunc用于完全一致的截断,已经在Firefox 24+和Edge中可用:

 var num = -2147483649.536; var result = Math.trunc(num); // -2147483649 

如果你不能依赖这个,并且总会有一个正数,那么你当然可以使用Math.floor

 var num = 20.536; var result = Math.floor(num); // 20 

最后,如果在[-2147483648,2147483647]中有一个数字,则可以使用任何按位运算符将其截断为32位。 | 0 | 0是通用的, >>> 0可以用来获得一个无符号的32位整数:

 var num = -20.536; var result = num | 0; // -20 

考虑到JavaScript在科学记数法中代表非常小或非常大的浮点数,Travis Pessetto的答案和mozey的trunc2函数是唯一正确的答案。

例如, parseInt(-2.2043642353916286e-15)将不会正确parsing该input。 而不是返回0它将返回-2

这是做到这一点的正确方法(也是最不健康的)

 function truncate(number) { return number > 0 ? Math.floor(number) : Math.ceil(number); } 

我会在这里添加我的解决scheme。 当值大于0时,我们可以使用floor,当它们小于零时,可以使用ceil。

 function truncateToInt(x) { if(x > 0) { return Math.floor(x); } else { return Math.ceil(x); } } 

然后:

 y = truncateToInt(2.9999); // results in 2 y = truncateToInt(-3.118); //results in -3 

将数字转换为一个string,并丢弃小数点后的所有内容。

 trunc = function(n) { return Number(String(n).replace(/\..*/, "")) } trunc(-1.5) === -1 trunc(1.5) === 1 

编辑2013-07-10

正如minitech指出的那样,再次想到string方法似乎有点过分。 因此,比较这里和别处列出的各种方法:

 function trunc1(n){ return parseInt(n, 10); } function trunc2(n){ return n - n % 1; } function trunc3(n) { return Math[n > 0 ? "floor" : "ceil"](n); } function trunc4(n) { return Number(String(n).replace(/\..*/, "")); } function getRandomNumber() { return Math.random() * 10; } function test(func, desc) { var t1, t2; var ave = 0; for (var k = 0; k < 10; k++) { t1 = new Date().getTime(); for (var i = 0; i < 1000000; i++) { window[func](getRandomNumber()); } t2 = new Date().getTime(); ave += t2 - t1; } console.info(desc + " => " + (ave / 10)); } test("trunc1", "parseInt"); test("trunc2", "mod"); test("trunc3", "Math"); test("trunc4", "String"); 

结果可能因硬件而异,如下所示:

 parseInt => 258.7 mod => 246.2 Math => 243.8 String => 1373.1 

Math.floor / ceil方法比parseInt和mod稍快。 与其他方法相比,stringperformance不佳。

使用Math.floor()

 var f = 20.536; var i = Math.floor(f); // 20 

http://jsfiddle.net/J4UVV/1/