Avatar ·

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

Всем привет! Я новичок в JavaScript и столкнулся с проблемой. Мне нужно работать с числами, но часто после математических операций я получаю числа с плавающей точкой (например, 3.14 или 7.999), а мне нужны целые числа. Я пробовал использовать parseInt(), но он не всегда работает как я ожидаю. Вот пример моего кода: ```javascript let price = 19.99; let quantity = 3; let total = price * quantity; // получаю 59.97 // Мне нужно округлить до целого console.log(parseInt(total)); // выводит 59 // Но я хотел бы получить 60, так как 59.97 ближе к 60 let negative = -3.7; console.log(parseInt(negative)); // выводит -3, хотя ожидал -4 ``` Также я заметил, что Math.floor() и Math.ceil() ведут себя по-разному с отрицательными числами. Подскажите, какой способ правильный для разных ситуаций? Нужно ли использовать Math.round() или есть другие методы? Заранее спасибо за помощь! <<>>

Основные методы преобразования 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.