Усечь / округлить целое число в JavaScript?
для сценария, который я пишу, мне нужно отобразить число, которое было округлено, но не десятичное или что-то за ним. Я дошел до округления его до третьего места, но я не уверен, как просто отбросить десятичное число и все, что мимо него, так как не похоже, что JavaScript имеет substr
функция, как PHP делает.
какие рекомендации?
5 ответов:
если у вас строка, разобрать его как целое число:
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
можно использовать для получения 32-разрядного целого числа без знака:var num = -20.536; var result = num | 0; // -20
ответ Трэвиса Песетто вместе с Мози
trunc2
function были единственными правильными ответами, учитывая, как JavaScript представляет очень маленькие или очень большие числа с плавающей запятой в научной нотации.например,
parseInt(-2.2043642353916286e-15)
не будет правильно анализировать этот вход. Вместо того, чтобы вернуться0
вернет-2
.Это правильный (и ИМХО наименее безумный) способ сделать это:
function truncate(number) { return number > 0 ? Math.floor(number) : Math.ceil(number); }
Я добавлю свое решение здесь. Мы можем использовать floor, когда значения выше 0 и 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
преобразовать число в строку и отбросить все после запятой.
trunc = function(n) { return Number(String(n).replace(/\..*/, "")) } trunc(-1.5) === -1 trunc(1.5) === 1
изменить 2013-07-10
как указал minitech и на второй мысли строковый метод действительно кажется немного чрезмерным. Итак, сравнивая различные методы, перечисленные здесь и в других местах:
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
Математика.метод пола / потолка немного быстрее, чем parseInt и mod. Строка не плохо по сравнению с другими методами.
использовать
Math.floor()
:var f = 20.536; var i = Math.floor(f); // 20