Как преобразовать число с плавающей точкой в целое число в JavaScript?
Основные методы преобразования float в integer в JavaScript
В JavaScript существует несколько способов преобразования чисел с плавающей точкой в целые. Выбор метода зависит от того, какой результат вы хотите получить: простое отбрасывание дробной части, округление до ближайшего целого, округление вниз или вверх. Давайте разберём каждый метод подробно.
1. Math.round() — округление до ближайшего целого
Этот метод округляет число по стандартным математическим правилам: если дробная часть >= 0.5, округление вверх, иначе — вниз.
console.log(Math.round(3.14)); // 3
console.log(Math.round(3.7)); // 4
console.log(Math.round(-3.7)); // -4
console.log(Math.round(-3.14)); // -3
Обратите внимание: с отрицательными числами Math.round() ведёт себя симметрично и интуитивно понятно.
2. Math.floor() — округление вниз (к меньшему целому)
Всегда округляет число вниз, к меньшему целому. Для положительных чисел это означает отбрасывание дробной части, для отрицательных — увеличение по модулю.
console.log(Math.floor(3.14)); // 3
console.log(Math.floor(3.7)); // 3
console.log(Math.floor(-3.14)); // -4
console.log(Math.floor(-3.7)); // -4
Важно: Math.floor(-3.14) даёт -4, потому что -4 меньше, чем -3.14.
3. Math.ceil() — округление вверх (к большему целому)
Всегда округляет число вверх. Для положительных чисел — увеличение, для отрицательных — уменьшение по модулю.
console.log(Math.ceil(3.14)); // 4
console.log(Math.ceil(3.7)); // 4
console.log(Math.ceil(-3.14)); // -3
console.log(Math.ceil(-3.7)); // -3
4. Math.trunc() — отбрасывание дробной части
Просто удаляет дробную часть, не выполняя округления. Работает одинаково для положительных и отрицательных чисел.
console.log(Math.trunc(3.14)); // 3
console.log(Math.trunc(3.7)); // 3
console.log(Math.trunc(-3.14)); // -3
console.log(Math.trunc(-3.7)); // -3
Этот метод появился в ES6 и является наиболее "честным" способом отбросить дробную часть.
5. parseInt() — с осторожностью
Вы упомянули parseInt(). Да, он тоже может преобразовывать числа, но его основное предназначение — парсинг строк. При работе с числами он сначала преобразует число в строку, а затем пытается извлечь целую часть. Это может привести к неожиданным результатам:
console.log(parseInt(3.14)); // 3
console.log(parseInt(3.7)); // 3
console.log(parseInt(-3.7)); // -3 (потому что parseInt читает до первого нечислового символа)
console.log(parseInt("12px")); // 12 (для строк это удобно)
Какой метод выбрать?
- Для обычного математического округления: используйте
Math.round(). Он идеально подходит для вашего примера с ценой (59.97 → 60). - Для отбрасывания дробной части (как в вашем примере с parseInt): используйте
Math.trunc()— он быстрее и предсказуемее. - Для работы с индексами массивов или отрицательными числами:
Math.floor()илиMath.ceil()в зависимости от логики. - Для парсинга строк с числами (например, "123abc"):
parseInt()илиparseFloat().
В вашем случае с суммой покупки лучше всего подойдёт Math.round(total) — это даст 60, что соответствует ожиданиям покупателя.
let price = 19.99;
let quantity = 3;
let total = price * quantity; // 59.97
let roundedTotal = Math.round(total); // 60
console.log(roundedTotal); // 60
<<Альтернативный подход: битовые операции
В JavaScript можно использовать битовые операции для быстрого отбрасывания дробной части. Этот метод работает, потому что битовые операции в JS сначала преобразуют операнды в 32-битные целые числа.
let num = 3.14;
console.log(num | 0); // 3
console.log(~~num); // 3
console.log(num >> 0); // 3
let negative = -3.7;
console.log(negative | 0); // -3
console.log(~~negative); // -3
Важные ограничения:
- Работает только для чисел в диапазоне от -2^31 до 2^31-1 (примерно ±2.1 миллиарда).
- Поведение аналогично
Math.trunc()— отбрасывает дробную часть, не округляя. - Не подходит для округления до ближайшего целого.
Этот метод может быть чуть быстрее вызова Math.trunc() в старых браузерах, но в современном JavaScript разница незначительна. Рекомендую использовать Math.trunc() для читаемости кода, а битовые операции — только если вам критична производительность в цикле из миллионов итераций.
Также помните, что для округления до определённого количества знаков после запятой (не до целого) используйте toFixed() или Math.round(num * 100) / 100.