Отсечение числа до двух десятичных без округления в JS
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Чтобы обрезать число до двух знаков после точки, примените метод Math.floor()
. Умножьте число на 100
, затем примените метод Math.floor()
и поделите полученный результат на 100
.
const truncateToTwo = num => Math.floor(num * 100) / 100;
console.log(truncateToTwo(123.456)); // 123.45
console.log(truncateToTwo(123.999)); // 123.99
Этот подход безопасно обрезает числа до двух знаков после точки, исключая риск округления.
Подробности: понимание процесса
Чтобы обрезать число со всеми тонкостями, важно понять низкоуровневые детали процесса. Обрезание числа подразумевает устранение избыточных знаков после точки без округления.
Строковый метод для избежания округления
Если говорить о высокой точности и мы не можем использовать Math.floor()
, можно применить строковый подход:
function truncateToStr(num) {
const numStr = num.toString();
const matchedPortion = numStr.match(/^-?\d+(?:\.\d{0,2})?/);
return matchedPortion ? Number(matchedPortion[0]) : num;
}
console.log(truncateToStr(123.4567)); // 123.45
console.log(truncateToStr(-123.4567)); //-123.45
Данный метод подходит как для обрезки чисел с плавающей точкой, так и при работе с отрицательными значениями.
Форматирование кода в функцию
Чтобы оптимизировать код и улучшить его читаемость, рекомендуется оформить логику обрезки числа в функцию:
const truncateDecimal = (num, decimalPlaces) => {
const factor = Math.pow(10, decimalPlaces);
return Math.trunc(num * factor) / factor;
};
console.log(truncateDecimal(123.456789, 2)); // 123.45
Функция Math.trunc
позволяет создать надежный способ обрезки числа до требуемого количества знаков после точки.
Визуализация
Представим обрезку числа в виде пиццы, от которой отрезаются в неоцененные куски, оставляя два желанных куска.
Представьте число как пиццу: 3.14159🍕
Обрезать до двух десятичных знаков – это как взять только два первых кусочка:
| 3 | . | 1 | 4 | 🍕 | -> Сохраняем: | 3 | . | 1 | 4 |
И у вас получилась превосходная порция пиццы, аккуратно обрезанная до двух десятичных знаков. 🍕
Обращение с особыми случаями
Также, как и в жизни, в числах бывают свои потенциальные проблемы и особенности. Рассмотрим некоторые из них:
Научная нотация как потенциальное препятствие
Числа в научной нотации требуют преварительного преобразования в обычную десятичную форму перед обрезкой:
function truncateScientific(num, decimalPlaces) {
let numStr = num.toString();
// Преобразовываем числа в научной нотации в десятичный формат
if (/\d+\.?\d*e[+-]*\d+/i.test(numStr)) {
let zero = '0';
let parts = String(num).toLowerCase().split('e');
let e = parts.pop();
let l = Math.abs(e);
let sign = e / l;
let coeff_array = parts[0].split('.');
if (sign === -1) {
coeff_array[0] = Math.abs(coeff_array[0]);
numStr = zero + '.' + new Array(l).join(zero) + coeff_array.join('');
} else {
let dec = coeff_array[1];
if (dec) l -= dec.length;
numStr = coeff_array.join('') + new Array(l + 1).join(zero);
}
}
return truncateToStr(numStr); // Производим обрезку как обычно
}
console.log(truncateScientific(1.23e-5, 2)); // 0.00
console.log(truncateScientific(1.23e+5, 2)); // 123000.00
Обработка весьма мелких чисел
Иногда совсем малые числа автоматически преобразуются в научную нотацию. Чтобы учесть это в процессе обрезки, используйте следующий код:
console.log(truncateScientific(0.000000123456, 2)); // 0.00
Полезные материалы
- JavaScript toFixed() Method — подходит для преобразования чисел в строковый формат с определённым количеством знаков после точки.
- String.prototype.slice() – JavaScript | MDN — помогает ужать строку до нужной длины.
- parseFloat() – JavaScript | MDN — конвертирует строковое представление числа в число с плавающей точкой.
- JavaScript Math floor() Method — необходим для округления чисел вниз до ближайшего целого.
- Handling Floating Point Precision in JavaScript — подробное объяснение принципов работы с числами с плавающей точкой.
- Интерфейс big.js — библиотека для выполнения точных математических расчётов с использованием таких функций, как
toFixed()
.