Как преобразовать число float в целое число в JavaScript?

Я хотел бы преобразовать float в целое число в JavaScript. На самом деле, я хотел бы знать, как выполнить стандартные преобразования: путем усечения и округления. И эффективно, а не путем преобразования в строку и синтаксического анализа.

13 ответов


var intvalue = Math.floor( floatvalue );
var intvalue = Math.ceil( floatvalue ); 
var intvalue = Math.round( floatvalue );

// `Math.trunc` was added in ECMAScript 6
var intvalue = Math.trunc( floatvalue );

ссылка на объект Math


примеры

положительное
value = 5.5

Math.floor(value) //  5
Math.ceil(value)  //  6
Math.round(value) //  6
Math.trunc(value) //  5
parseInt(value)   //  5
~~value           //  5
value | 0         //  5
value >> 0        //  5
value >>> 0       //  5
value - value % 1 //  5
отрицательный
value = -5.5

Math.floor(value) // -6
Math.ceil(value)  // -5
Math.round(value) // -5
Math.trunc(value) // -5
parseInt(value)   // -5
value | 0         // -5
~~value           // -5
value >> 0        // -5
value >>> 0       // 4294967291
value - value % 1 // -5
Positive-большие числа
value = Number.MAX_SAFE_INTEGER/10 // 900719925474099.1

Math.floor(value) //  900719925474099
Math.ceil(value)  //  900719925474100
Math.round(value) //  900719925474099
Math.trunc(value) //  900719925474099
parseInt(value)   //  900719925474099
value | 0         //  858993459
~~value           //  858993459
value >> 0        //  858993459
value >>> 0       //  858993459
value - value % 1 //  900719925474099
минус - большие числа
value = Number.MAX_SAFE_INTEGER/10 * -1 // -900719925474099.1

Math.floor(value) // -900719925474100
Math.ceil(value)  // -900719925474099
Math.round(value) // -900719925474099
Math.trunc(value) // -900719925474099
parseInt(value)   // -900719925474099
value | 0         // -858993459
~~value           // -858993459
value >> 0        // -858993459
value >>> 0       //  3435973837
value - value % 1 // -900719925474099

побитовый оператор или

побитовое или оператор может использоваться, чтобы обрезать плавающие цифры и плюсы, а также минусы:

function float2int (value) {
    return value | 0;
}

результаты

float2int(3.1) == 3
float2int(-3.1) == -3
float2int(3.9) == 3
float2int(-3.9) == -3

сравнение производительности?

я создал тест см. Этот тест jsperf это сравнивает производительность между:

  • Math.floor(val)
  • val | 0 побитовое или
  • ~~val побитовое не
  • parseInt(val)

это работает только с положительными числами. В этом случае вы можете использовать побитовые операции, а также


Примечание: Вы не можете использовать Math.floor() в качестве замены для усечения, потому что Math.floor(-3.1) = -4, а не -3 !!

правильной заменой усечения будет:

function truncate(value)
{
    if (value < 0) {
        return Math.ceil(value);
    }

    return Math.floor(value);
}

двойной побитовое не оператор можно использовать для того чтобы усечь поплавки. Другие операции вы упомянули доступны через Math.floor, Math.ceil и Math.round.

> ~~2.5
2
> ~~(-1.4)
-1

более подробная информация предоставлена James Padolsey.


для усечь:

var intvalue = Math.floor(value);

для тур:

var intvalue = Math.round(value);

можно использовать parseInt метод без округления. Будьте осторожны с пользовательским вводом из-за параметров префикса 0x (hex) и 0 (восьмеричный).

var intValue = parseInt(floatValue, 10);

битовый сдвиг на 0, что эквивалентно делению на 1

// >> or >>>
2.0 >> 0; // 2
2.0 >>> 0; // 2

в вашем случае, когда вы хотите строку в конце (для вставки запятых), вы также можете просто использовать число.однако функция toFixed () будет выполнять округление.


здесь много предложений. Побитовое или кажется самым простым. Вот еще одно короткое решение, которое работает с отрицательными числами, а также с помощью оператора по модулю. Это, вероятно, легче понять, чем побитовое или:

intval = floatval - floatval%1;

этот метод также работает с номерами с высоким значением, где ни "|0", ни"~~", ни ">>0 " работают правильно:

> n=4294967295;
> n|0
-1
> ~~n
-1
> n>>0
-1
> n-n%1
4294967295

еще один возможный способ - использовать операцию XOR:

console.log(12.3 ^ 0); // 12
console.log("12.3" ^ 0); // 12
console.log(1.2 + 1.3 ^ 0); // 2
console.log(1.2 + 1.3 * 2 ^ 0); // 3
console.log(-1.2 ^ 0); // -1
console.log(-1.2 + 1 ^ 0); // 0
console.log(-1.2 - 1.3 ^ 0); // -2

приоритет побитовых операций меньше приоритета математических операций, это полезно. Примерьhttps://jsfiddle.net/au51uj3r/


до усечь:

// Math.trunc() is part of the ES6 spec
Math.trunc( 1.5 );  // returns 1
Math.trunc( -1.5 ); // returns -1
// Math.floor( -1.5 ) would return -2, which is probably not what you wanted

до круглые:

Math.round( 1.5 );  // 2
Math.round( 1.49 ); // 1
Math.round( -1.6 ); // -2
Math.round( -1.3 ); // -1

Если вы используете angularjs, то простое решение следующим образом в привязке шаблона HTML

{{val | number:0}}

он преобразует val в integer

перейдите по этой ссылке docs.angularjs.org/api/ng/filter/number


Я просто хочу отметить, что монетарно вы хотите округлить, а не trunc. Быть от копейки гораздо менее вероятно, так как округление 4.999452 * 100 даст вам 5, более репрезентативный ответ.

и, кроме того, не забывайте о банковским округлением, что является способом противостоять слегка положительному смещению, которое дает прямое округление - ваше финансовое приложение может потребовать этого.

округление Гаусса / банкира В JavaScript