Как округлить число: Math.round, toFixed и другие
До целого:
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До двух знаков после запятой:
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 округляет половину в сторону большего:
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…. Поэтому оба способа округляют вниз:
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 выводит число по правилам языка — с десятичной запятой и пробелами между разрядами:
const price = 1234.5;
console.log(price.toLocaleString("ru-RU", { minimumFractionDigits: 2, maximumFractionDigits: 2 }));Получится 1 234,50. Между разрядами здесь стоит неразрывный пробел, поэтому такую строку используют только для показа, а не для дальнейших расчётов.