Округление чисел в JavaScript: round, floor, ceil в JS

JavaScript предоставляет несколько встроенных методов для округления чисел, которые находятся в объекте Math. Каждый метод выполняет округление по разным правилам: к ближайшему целому, вверх или вниз.

Math.round — округление до ближайшего целого

Метод Math.round округляет число к ближайшему целому. Если дробная часть 0.5 или больше, число округляется вверх, в противном случае — вниз.

console.log(Math.round(4.3)); // 4
console.log(Math.round(4.7)); // 5
console.log(Math.round(-4.5)); // -4

Math.floor — округление вниз

Math.floor всегда округляет число в меньшую сторону (в сторону минус бесконечности).

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

Math.ceil — округление вверх

Math.ceil всегда округляет число в большую сторону (в сторону плюс бесконечности).

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

Округление до заданного знака после запятой

Для округления до определенного числа знаков после запятой можно комбинировать Math.round и арифметику:

function roundTo(value, decimals) {
    const factor = 10 ** decimals;
    return Math.round(value * factor) / factor;
}

console.log(roundTo(3.14159, 2)); // 3.14
console.log(roundTo(1.005, 2)); // 1.01 (особенность чисел с плавающей точкой)

Проблемы с точностью

JavaScript использует формат чисел с плавающей точкой двойной точности (IEEE 754), поэтому некоторые числа округляются не совсем корректно:

console.log(1.005 * 100); // 100.49999999999999

Решением может быть более надежное округление с использованием трюка с добавлением небольшого числа:

function safeRound(value, decimals) {
    const factor = 10 ** decimals;
    return Math.round((value + Number.EPSILON) * factor) / factor;
}

console.log(safeRound(1.005, 2)); // 1.01

Округление через toFixed

Метод toFixed приводит число к строке с заданным числом знаков после запятой:

console.log((3.14159).toFixed(2)); // '3.14'

Однако toFixed возвращает строку, поэтому для дальнейших вычислений ее придется преобразовать обратно в число:

const rounded = Number((3.14159).toFixed(2));
console.log(rounded); // 3.14

Округление чисел в JavaScript — это частая задача при работе с ценами, координатами, процентами и другими данными, где важна точность представления. Выбор метода зависит от конкретных требований: до целого числа, до десятых или строго вверх/вниз. Понимание работы чисел с плавающей точкой помогает избегать неожиданных результатов при таких операциях.