Обрезать/округлить целое число в JavaScript?
Для script, я пишу, мне нужно отобразить число, округленное, но не десятичное или что-нибудь еще. Я дошел до того, чтобы округлить его до третьего места, но я не уверен, как это сделать, просто отбросив десятичную и все прошлое, так как это не похоже на то, что JavaScript имеет функцию substr
, такую как PHP.
Любые рекомендации?
Ответы
Ответ 1
Если у вас есть строка, проанализируйте ее как целое число:
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
Ответ 2
Тревис Пессетто отвечал вместе с функцией mozey trunc2
, были единственными правильными ответами, рассматривая, как JavaScript представляет очень маленькие или очень большие числа с плавающей запятой в научной нотации.
Например, parseInt(-2.2043642353916286e-15)
не будет корректно разбирать этот ввод. Вместо возврата 0
он вернет -2
.
Это правильный (и имхо наименее безумный) способ сделать это:
function truncate(number)
{
return number > 0
? Math.floor(number)
: Math.ceil(number);
}
Ответ 3
Я добавлю свое решение здесь. Мы можем использовать пол, когда значения выше 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
Ответ 4
Преобразуйте число в строку и выбросите все после десятичной дроби.
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
Метод Math.floor/ceil немного быстрее, чем parseInt и mod. Строка работает плохо по сравнению с другими методами.
Ответ 5
Используйте Math.floor()
:
var f = 20.536;
var i = Math.floor(f); // 20
http://jsfiddle.net/J4UVV/1/
Ответ 6
Функция Math.trunc() удаляет все дробные цифры.
Для положительного числа он ведет себя точно так же, как Math.floor():
console.log(Math.trunc(89.13349)); // output is 89
Для отрицательных чисел он ведет себя так же, как Math.ceil():
console.log(Math.trunc(-89.13349)); //output is -89