Глиф Учебники

Как округлить число: Math.round, toFixed и другие

Справочник · JavaScript · 1 минута чтения

До целого:

JavaScript
const x = 2.567;

console.log(Math.round(x));
console.log(Math.floor(x));
console.log(Math.ceil(x));
console.log(Math.trunc(x));
Вывод
3
2
3
2

До двух знаков после запятой:

JavaScript
const x = 2.567;

console.log(x.toFixed(2));
console.log(Math.round(x * 100) / 100);
Вывод
2.57
2.57

Какой способ выбрать

СпособЧто делаетРезультат
Math.round(x)до ближайшего целогочисло
Math.floor(x)вниз, к меньшему целомучисло
Math.ceil(x)вверх, к большему целомучисло
Math.trunc(x)отбрасывает дробную частьчисло
x.toFixed(n)до n знаков после точки, для выводастрока
Math.round(x * 100) / 100до двух знаков, для расчётовчисло

toFixed возвращает строку — это удобно для вывода (5.10 с нулём в конце), но с ней нельзя дальше считать: (2.567).toFixed(2) + 1 даёт строку "2.571". Если нужно число, оберните: Number(x.toFixed(2)).

До десятков и сотен

Тот же приём в обратную сторону: разделить, округлить, умножить. Math.round(1234 / 10) * 10 даёт 1230, Math.round(1234 / 100) * 100 — 1200. Так округляют цены и показания до круглых чисел.

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

Math.floor и Math.trunc для отрицательных чисел ведут себя по-разному, а Math.round округляет половину в сторону большего:

JavaScript
console.log(Math.floor(-2.5));
console.log(Math.trunc(-2.5));
console.log(Math.round(-2.5));
console.log(Math.round(2.5));
Вывод
-3
-2
-2
3

Почему 1.005 округляется до 1.00

Дробные числа хранятся в двоичном виде, и 1.005 на самом деле чуть меньше: 1.00499999…. Поэтому оба способа округляют вниз:

JavaScript
console.log((1.005).toFixed(2));
console.log(Math.round(1.005 * 100) / 100);
console.log(Math.round((1.005 + Number.EPSILON) * 100) / 100);
Вывод
1.00
1
1.01

Прибавка Number.EPSILON (крошечное число) помогает в таких пограничных случаях, но не во всех. Для денег надёжнее считать в целых копейках, а рубли показывать только при выводе: 1005 копеек — (1005 / 100).toFixed(2).

Красивый вывод с запятой

toLocaleString выводит число по правилам языка — с десятичной запятой и пробелами между разрядами:

JavaScript
const price = 1234.5;
console.log(price.toLocaleString("ru-RU", { minimumFractionDigits: 2, maximumFractionDigits: 2 }));

Получится 1 234,50. Между разрядами здесь стоит неразрывный пробел, поэтому такую строку используют только для показа, а не для дальнейших расчётов.