Learn JavaScript

Math.trunc() - метод для удаления дробной части числа в JavaScript

Math.trunc() просто удаляет дробную часть числа.

Это один из самых понятных способов быстро получить целую часть без округления вверх или вниз.

Синтаксис

Math.trunc(x)

x - число, у которого нужно отбросить дробную часть.

Что делает Math.trunc()

Метод возвращает число без дробной части.

console.log(Math.trunc(4.9)); // 4
console.log(Math.trunc(4.1)); // 4
console.log(Math.trunc(4));   // 4

Главное здесь то, что Math.trunc() не округляет, а именно отрезает всё после точки.

Что возвращает Math.trunc()

Math.trunc() возвращает число типа number.

const result = Math.trunc(12.7);

console.log(result);        // 12
console.log(typeof result); // "number"

Это именно число, а не строка.

Отрицательные числа

Вот здесь и видно главное отличие от Math.floor().

console.log(Math.trunc(-4.1)); // -4
console.log(Math.trunc(-4.9)); // -4

Метод просто убирает дробную часть и не пытается двигаться к -Infinity или +Infinity.

Math.trunc() и Math.floor()

Эти методы часто путают.

console.log(Math.trunc(4.9));  // 4
console.log(Math.floor(4.9));  // 4
console.log(Math.trunc(-4.9)); // -4
console.log(Math.floor(-4.9)); // -5

На положительных числах результат часто одинаковый.

На отрицательных разница становится принципиальной:

  • Math.trunc() просто отбрасывает дробную часть
  • Math.floor() идёт вниз к -Infinity

Math.trunc() и Math.ceil()

Math.ceil() делает совсем другое.

console.log(Math.trunc(4.9)); // 4
console.log(Math.ceil(4.9));  // 5
  • Math.trunc() убирает дробную часть
  • Math.ceil() идёт вверх к +Infinity

Math.trunc() и Math.round()

Math.round() тоже не то же самое.

console.log(Math.trunc(4.9)); // 4
console.log(Math.round(4.9)); // 5
  • Math.trunc() ничего не округляет
  • Math.round() выбирает ближайшее целое

Нюанс с -0

В некоторых случаях Math.trunc() может вернуть -0.

console.log(Math.trunc(-0.1)); // -0

Обычно в выводе это выглядит как 0, но технически это отдельное значение.

Проверить можно так:

console.log(Object.is(Math.trunc(-0.1), -0)); // true

Для большинства обычных задач этот нюанс не мешает, но знать о нём полезно.

Неявное приведение типов

Math.trunc() сначала пытается привести аргумент к числу.

console.log(Math.trunc("4.9")); // 4
console.log(Math.trunc(null));  // 0
console.log(Math.trunc(true));  // 1
console.log(Math.trunc(undefined)); // NaN

На практике обычно лучше передавать в метод уже готовое число.

NaN и Infinity

Для специальных значений метод ведёт себя предсказуемо.

console.log(Math.trunc(NaN));       // NaN
console.log(Math.trunc(Infinity));  // Infinity
console.log(Math.trunc(-Infinity)); // -Infinity

Число не меняется

Math.trunc() не изменяет исходное значение. Он только возвращает новый результат.

const value = 3.7;
const truncated = Math.trunc(value);

console.log(value);      // 3.7
console.log(truncated);  // 3

Когда это полезно

Math.trunc() удобно использовать, когда:

  • нужно просто отбросить дробную часть
  • не требуется математическое округление
  • важно сохранить поведение одинаковым по смыслу для положительных и отрицательных чисел

Пример:

const value = 12.99;

console.log(Math.trunc(value)); // 12

Частые ошибки

Путать Math.trunc() и Math.floor()

console.log(Math.trunc(-4.9)); // -4
console.log(Math.floor(-4.9)); // -5

Это самая частая ошибка, особенно на отрицательных числах.

Думать, что метод округляет

console.log(Math.trunc(4.9)); // 4

Метод не округляет, а просто отбрасывает дробную часть.

Забывать про -0

console.log(Math.trunc(-0.1)); // -0

Обычно это не мешает, но в редких случаях может всплыть при точных сравнениях.

Быстрая памятка

  • Math.trunc() удаляет дробную часть числа
  • метод возвращает number
  • он не округляет вверх или вниз
  • на отрицательных числах это особенно отличает его от Math.floor()
  • в некоторых случаях результатом может быть -0
  • это не то же самое, что Math.floor(), Math.ceil() и Math.round()

Коротко

Math.trunc() - это удобный способ просто отбросить дробную часть числа в JavaScript. Главное, что стоит запомнить: метод не округляет, и именно поэтому на отрицательных числах он заметно отличается от Math.floor().