Как преобразовать число 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 );
примеры
положительное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
можно использовать parseInt метод без округления. Будьте осторожны с пользовательским вводом из-за параметров префикса 0x (hex) и 0 (восьмеричный).
var intValue = parseInt(floatValue, 10);
в вашем случае, когда вы хотите строку в конце (для вставки запятых), вы также можете просто использовать число.однако функция 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, более репрезентативный ответ.
и, кроме того, не забывайте о банковским округлением, что является способом противостоять слегка положительному смещению, которое дает прямое округление - ваше финансовое приложение может потребовать этого.