Округление чисел с плавающей точкой в JavaScript: Math.round()
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Чтобы округлить число с плавающей точкой до двух знаков после запятой, можно применить следующую функцию:
const round = (num) => Math.round(num * 100) / 100;
console.log(round(5.123)); // И получаем 5.12
Если требуется округление до n
знаков после запятой, замените 100
на 10**n
.
Особенности округления с помощью метода toFixed
Метод toFixed()
в JavaScript особенно удобен для округления числа до определенного количества знаков после запятой. Он возвращает строковое значение.
let rounded = (num, decimals) => Number(num.toFixed(decimals));
console.log(rounded(6.688689, 2)); // Округляем до 6.69
Учтите, что toFixed()
округляет число вверх или вниз в зависимости от того, превышает ли последняя цифра 5 или нет.
Методы округления и нежданные сложности
Существует не один путь к Риму...
В JavaScript возможно несколько вариантов округления:
- Math.round(num) – универсальное округление до ближайшего целого числа.
- Math.ceil(num) – всегда округляет число вверх.
- Math.floor(num) – всегда округляет вниз.
Чтобы округлить с нужной точностью с помощью этих методов, используйте умножение и деление на 10^n
.
...И непредвиденные трудности
Числа с плавающей точкой иногда вызывают проблемы из-за особенностей вычислений. Для минимизации ошибок можно применять дополнительные проверки или искать помощи у специализированных библиотек для точных вычислений.
Создание собственной функции округления
Если потребуется более гибкий контроль, стоит подумать о создании собственной функции decimalAdjust
:
function decimalAdjust(type, value, exp) {
if (typeof exp === 'undefined' || +exp === 0) {
return Math[type](value);
}
value = +value;
exp = +exp;
if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0)) {
return NaN;
}
value = value.toString().split('e');
value = Math[type](+(value[0] + 'e' + (value[1] ? (+value[1] – exp) : -exp)));
value = value.toString().split('e');
return +(value[0] + 'e' + (value[1] ? (+value[1] + exp) : exp));
}
const round10 = (value, exp) => decimalAdjust('round', value, exp);
Сравнение производительности: какой способ быстрее?
Сравнивая производительность методов округления, можно выбрать наиболее оптимальный вариант:
console.time('Используя toFixed');
for (let i = 0; i < 100000; i++) {
(Math.PI).toFixed(2);
}
console.timeEnd('Используя toFixed'); // Фиксируем время!
console.time('Используя умножение/деление');
for (let i = 0; i < 100000; i++) {
Math.round(Math.PI * 100) / 100;
}
console.timeEnd('Используя умножение/деление'); // Кто быстрее?
Визуализация
Для наглядности привожу эмодзи, которые иллюстрируют различные методы округления:
| Метод | Эквивалент с эмодзи |
| -------------------- | ------------------ |
| Math.round(3.14) | 🌳🟩 → 🌳 |
| Math.ceil(3.14) | 🌳🔼 → 🌲 |
| Math.floor(3.14) | 🌳🔽 → 🌴 |
| +(3.14159.toFixed(2))| 🌳📏 → 🎄 |
Как и в садоводстве, где аккуратная обрезка приводит к красоте, так и в округлении чисел точность имеет значение.
Округление: то, что не расскажут в учебниках
Метод Number.toPrecision()
может быть использован как скрытый инструмент для округления числа до определенного количества значимых чисел:
let num = 5.123456;
console.log(+num.toPrecision(4)); // Мы получаем 5.123
Унарный оператор +
в данном случае конвертирует строку обратно в число.
За рамками стандартных методов
Для более сложных ситуаций с округлением вы можете обратиться к npm-пакетам, таким как mathjs
, decimal.js
или exact-round
– они предлагают готовые решения для различных задач.
Внимание к деталям
Когда речь идет о финансовых или научных вычислениях, важно тщательно тестировать выбранный метод округления для обеспечения точности результатов.