Усечь / округлить целое число в JavaScript?


для сценария, который я пишу, мне нужно отобразить число, которое было округлено, но не десятичное или что-то за ним. Я дошел до округления его до третьего места, но я не уверен, как просто отбросить десятичное число и все, что мимо него, так как не похоже, что JavaScript имеет substr функция, как PHP делает.

какие рекомендации?

5 56

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

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