截断/整数在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不佳。