Как преобразовать число с плавающей точкой в целое число в JavaScript?
Я хотел бы преобразовать float в целое число в JavaScript. На самом деле, я хотел бы знать, как делать ОБА стандартных конверсий: путем усечения и округления. И эффективно, а не путем преобразования в строку и разбора.
Ответы
Ответ 1
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=x // x=5 5<x<5.5 5.5<=x<6
Math.floor(value) // 5 5 5
Math.ceil(value) // 5 6 6
Math.round(value) // 5 5 6
Math.trunc(value) // 5 5 5
parseInt(value) // 5 5 5
~~value // 5 5 5
value | 0 // 5 5 5
value >> 0 // 5 5 5
value >>> 0 // 5 5 5
value - value % 1 // 5 5 5
Отрицательный // value=x // x=-5 -5>x>=-5.5 -5.5>x>-6
Math.floor(value) // -5 -6 -6
Math.ceil(value) // -5 -5 -5
Math.round(value) // -5 -5 -6
Math.trunc(value) // -5 -5 -5
parseInt(value) // -5 -5 -5
value | 0 // -5 -5 -5
~~value // -5 -5 -5
value >> 0 // -5 -5 -5
value >>> 0 // 4294967291 4294967291 4294967291
value - value % 1 // -5 -5 -5
Положительный - Большие числа // x = Number.MAX_SAFE_INTEGER/10 // =900719925474099.1
// value=x x=900719925474099 x=900719925474099.4 x=900719925474099.5
Math.floor(value) // 900719925474099 900719925474099 900719925474099
Math.ceil(value) // 900719925474099 900719925474100 900719925474100
Math.round(value) // 900719925474099 900719925474099 900719925474100
Math.trunc(value) // 900719925474099 900719925474099 900719925474099
parseInt(value) // 900719925474099 900719925474099 900719925474099
value | 0 // 858993459 858993459 858993459
~~value // 858993459 858993459 858993459
value >> 0 // 858993459 858993459 858993459
value >>> 0 // 858993459 858993459 858993459
value - value % 1 // 900719925474099 900719925474099 900719925474099
Отрицательный - Большие числа // x = Number.MAX_SAFE_INTEGER/10 * -1 // -900719925474099.1
// value = x // x=-900719925474099 x=-900719925474099.5 x=-900719925474099.6
Math.floor(value) // -900719925474099 -900719925474100 -900719925474100
Math.ceil(value) // -900719925474099 -900719925474099 -900719925474099
Math.round(value) // -900719925474099 -900719925474099 -900719925474100
Math.trunc(value) // -900719925474099 -900719925474099 -900719925474099
parseInt(value) // -900719925474099 -900719925474099 -900719925474099
value | 0 // -858993459 -858993459 -858993459
~~value // -858993459 -858993459 -858993459
value >> 0 // -858993459 -858993459 -858993459
value >>> 0 // 3435973837 3435973837 3435973837
value - value % 1 // -900719925474099 -900719925474099 -900719925474099
Ответ 2
Оператор побитового ИЛИ
Побитовое или оператор может использоваться для усечения чисел с плавающей запятой и работает как с позитивами, так и с негативами:
function float2int (value) {
return value | 0;
}
Результаты
float2int(3.1) == 3
float2int(-3.1) == -3
float2int(3.9) == 3
float2int(-3.9) == -3
Сравнение производительности?
Я создал JSPerf test, который сравнивает производительность между:
-
Math.floor(val)
-
val | 0
побитовое ИЛИ
-
~~val
побитовое НЕ
-
parseInt(val)
который работает только с положительными числами. В этом случае вы можете безопасно использовать побитовые операции, а также функцию Math.floor
.
Но если вам нужен код для работы с позитивами, а также с негативами, то побитовая операция будет самой быстрой (предпочтительной является OR). Этот другой тест JSPerf сравнивает то же самое, где довольно очевидно, что из-за дополнительной проверки знака Math теперь является самой медленной четыре.
Примечание
Как указано в комментариях, операторы BITWISE работают с подписанными 32-битными целыми числами, поэтому большие числа будут преобразованы, например:
1234567890 | 0 => 1234567890
12345678901 | 0 => -539222987
Ответ 3
Примечание. Вы не можете использовать Math.floor()
в качестве замены для усечения, потому что Math.floor(-3.1) = -4
и не -3
!!
Правильная замена для усечения будет:
function truncate(value)
{
if (value < 0) {
return Math.ceil(value);
}
return Math.floor(value);
}
Ответ 4
Двойной побитовый не оператор может использоваться для обрезания поплавков. Другие описанные вами операции доступны через Math.floor
, Math.ceil
и Math.round
.
> ~~2.5
2
> ~~(-1.4)
-1
Подробнее любезно предоставлено Джеймсом Падольси.
Ответ 5
Для усечения:
var intvalue = Math.floor(value);
Для раунда:
var intvalue = Math.round(value);
Ответ 6
Вы можете использовать метод parseInt без округления. Будьте осторожны с пользовательским вводом из-за опций 0x (шестнадцатеричный) и 0 (восьмеричный).
var intValue = parseInt(floatValue, 10);
Ответ 7
Бит сдвигается на 0, что эквивалентно делению на 1
// >> or >>>
2.0 >> 0; // 2
2.0 >>> 0; // 2
Ответ 8
В вашем случае, когда вам нужна строка в конце (для вставки запятых), вы также можете просто использовать функцию Number.toFixed(), однако это будет выполнять округление.
Ответ 9
Здесь много предложений. Побитовое ИЛИ, по-видимому, самое простое. Вот еще одно короткое решение, которое также работает с отрицательными числами, используя оператор modulo. Вероятно, легче понять, чем побитовое ИЛИ:
intval = floatval - floatval%1;
Этот метод также работает с большими номерами значений, где ни '| 0', ни '~~', ни ' → 0' не работают правильно:
> n=4294967295;
> n|0
-1
> ~~n
-1
> n>>0
-1
> n-n%1
4294967295
Ответ 10
Еще один возможный способ - использовать операцию 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/
Ответ 11
В усекать:
// 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
Ответ 12
Я просто хочу указать, что монетически вы хотите округлить, а не trunc. Быть у пенни гораздо менее вероятно, так как 4.999452 * 100 округленных даст вам 5, более представительный ответ.
И кроме того, не забывайте о округлении банкира, что является способом противодействия слегка положительному уклону, что прямое округление дает - ваше финансовое приложение может потребовать его.
Округление гауссова/банкира в JavaScript
Ответ 13
Если вы используете angularjs, тогда простое решение, как указано в HTML Template Binding
{{val | number:0}}
он преобразует val в целое число
перейдите по этой ссылке docs.angularjs.org/api/ng/filter/number
Ответ 14
Если вы посмотрите на собственный объект Math
в JavaScript, вы получите весь набор функций для работы с числами и значениями и т.д.
В основном то, что вы хотите сделать, довольно просто и встроено в JavaScript...
Представьте, что у вас есть номер ниже:
const myValue = 56.4534931;
и теперь, если вы хотите округлить его до ближайшего числа, просто сделайте:
const rounded = Math.floor(myValue);
и вы получите:
56
Если вы хотите округлить его до ближайшего числа, просто выполните:
const roundedUp = Math.ceil(myValue);
и вы получите:
57
Также Math.round
просто Math.round
его до большего или меньшего числа, зависит от того, какой из них ближе к числу flot.
Также вы можете использовать ~~
после числа с плавающей точкой, который преобразует число с плавающей точкой в целое число.
Вы можете использовать его как ~~myValue
...