Округлення є важливою операцією при роботі з десятковими числами, оскільки вона дозволяє представити значення у більш зручній формі, зменшуючи кількість цифр після коми. Проте, різні мови програмування можуть використовувати різні підходи до округлення, що може викликати неочікувані результати в певних сценаріях. У цьому дописі ми розглянемо математичні правила округлення та їх імплементацію в JavaScript та Ruby.
Математичне округлення
Математичне округлення — це процес зменшення кількості десяткових знаків числа, щоб зробити його простішим для використання, відображення або подальших розрахунків. Це особливо важливо у фінансових, наукових та інженерних обчисленнях, де точність має бути збалансована з практичністю.
Округлення до найближчого числа
Цей метод округлює число до найближчого цілого або десяткового числа. Якщо число знаходиться рівно посередині між двома варіантами (наприклад, 2.5), воно округлюється до більшого числа.
Правило: Якщо дробова частина ≥ 0.5, округлюємо вгору. Якщо менше — округлюємо вниз.
Приклад:
2.4 → 2
2.5 → 3
Округлення вниз
При використанні цього методу всі значення округлюються в меншу сторону, незалежно від дробової частини числа.
Правило: Число завжди округлюється до меншого цілого.
Приклад:
2.9 → 2
-2.1 → -3
Округлення вгору
Округлюється в більший бік, незалежно від дробової частини числа.
Правило: Число завжди округлюється вгору до найближчого цілого.
Приклад:
2.1 → 3
-2.9 → -2
Відсічення десяткової частини
Цей метод просто відкидає дробову частину, залишаючи цілу.
Правило: Дробова частина числа ігнорується.
Приклад:
3.9 → 3
-3.9 → -3
Повторили шкільну программу і можна перейти до Javascript та Ruby. Розглянемо існуючі методи, нюанси і підводні камені кожної з цих мов програмування. Я розглядаю саме ці мови, бо це мій основний робочий стек.
Округлення в JavaScript
У JavaScript округлення відбувається через методи Math.round(), Math.floor(), та Math.ceil():
Приклади:
Math.round(4.73) → 5
Math.round(4.76) → 5
Math.floor(4.76) → 4 (округлення вниз)
Math.ceil(4.76) → 5 (округлення вгору)
Але спочатку розглянемо методи toFixed() та toPrecision().
Округлення до певної кількості знаків після коми (JS)
В JavaScript для округлення числа до певної кількості знаків після коми найчастіше використовують методи toFixed() та toPrecision().
Метод toFixed() дозволяє округлити число до вказаної кількості десяткових знаків і повертає результат у вигляді рядка.
num.toFixed(digits);
num: Число, яке треба округлити.
digits: Кількість знаків після коми.
let num = 5.6789;
console.log(num.toFixed(2)); // "5.68"
У прикладі число 5.6789 було округлене до двох знаків після коми, результат — "5.68". Метод завжди повертає рядок, тому за потреби його можна перетворити на число за допомогою parseFloat() або Number().
Метод toPrecision() дозволяє округлювати число з вказаною загальною кількістю цифр (включаючи цифри до і після коми).
num.toPrecision(precision);
precision: Кількість цифр.
let num = 5.6789;
console.log(num.toPrecision(3)); // "5.68"
Тут число 5.6789 округлене до трьох цифр, результат — "5.68".
Якщо підсумувати та порівняти ці методи:
toFixed() фіксує кількість знаків після коми.
toPrecision() працює з усіма цифрами числа, включаючи цілі та дробові.
Методи округлення toFixed() і toPrecision(), використовують загальні математичні правила округлення — арифметичне округлення. Це означає, що вони округлюють число вгору або вниз в залежності від значення наступної цифри після межі округлення.
Правила округлення:
Якщо цифра після межі округлення менша за 5, число округлюється вниз (в менший бік).
Якщо цифра після межі округлення дорівнює або більше 5, число округлюється вгору (в більший бік).
Приклади .toFixed() з .5Число 2.5 округлюється вгору до 3, оскільки цифра після коми дорівнює 5.
let num = 2.5;
console.log(num.toFixed(0)); // "3"
Округлюючи до одного знака після коми, число 2.45 стає 2.5, оскільки цифра після межі округлення (4) не досягає 5.
let num = 2.45;
console.log(num.toFixed(1)); // "2.5"
Приклади .toPrecision() з .5При округленні до двох значущих цифр число 1.005 стає 1.0, оскільки межа округлення стоїть на 0, і наступна цифра менша за 5.
let num = 1.005;
console.log(num.toPrecision(2)); // "1.0"
Число 2.555 округлюється до трьох значущих цифр, і ми отримуємо 2.56, оскільки після межі округлення стоїть цифра 5.
let num = 2.555;
console.log(num.toPrecision(3)); // "2.56"
Особливості JS
JavaScript округлює числа з плаваючою точкою, і інколи може траплятися неточне округлення через представлення чисел у двійковій системі. Наприклад:
let num = 1.005;
console.log(num.toFixed(2)); // "1.00" (очікувалось "1.01")
Тут очікувалось, що 1.005 стане 1.01, але через двійкову арифметику результат може бути трохи іншим. Для боротьби з цими проблемами часто застосовують методи на кшталт множення числа на 10^n перед округленням або використання спеціалізованих бібліотек для точних обчислень. Можна зустріти такі варіанти вирішення цієї проблеми:
let num = 1.005;
let rounded = Math.round(num * 100) / 100;
console.log(rounded); // "1.01"
Ось ми і дійшли до практичного використання методів Math. Для того, щоб краще зрозуміти методи округлення в JavaScript, особливо ті, що входять до складу бібліотеки Math, давай розглянемо основні з них і наведемо приклади їх використання.
Math.round()
Метод округлює число до найближчого цілого. Якщо дробова частина числа більша або дорівнює 0.5 — округлює в більший бік, інакше — в менший.
Math.round(4.7); // 5
Math.round(4.3); // 4
Math.round(4.5); // 5 (якщо .5, то в більший бік)
Math.round(-1.5); // -1 (негативні .5 округлюються також в більший бік)
Math.floor()
Цей метод завжди округлює число вниз (до найближчого меншого цілого числа).
Math.floor(4.9); // 4
Math.floor(4.1); // 4
Math.floor(-2.3); // -3 (негативні числа також округлюються в менший бік)
Math.ceil()
Цей метод завжди округлює число вгору (до найближчого більшого цілого числа).
Math.ceil(4.1); // 5
Math.ceil(4.9); // 5
Math.ceil(-2.3); // -2 (негативні числа округлюються в більший бік)
Math.trunc()
Цей метод відсікає дробову частину числа, повертаючи тільки цілу частину, незалежно від того, чи є дробова частина позитивною чи негативною.
Ну і для зручності маленький cheatsheet у вигляді картинки:
А зараз розглянемо методи округлення в Ruby.
Округлення в Ruby
Ruby, як і JavaScript, має кілька методів для округлення чисел. Основні методи включають round, floor, ceil та truncate. Давайте детальніше розглянемо кожен із них.
.round
Метод round округлює число до найближчого цілого або до заданої кількості знаків після коми. Якщо дробова частина числа дорівнює 0.5 або більше, число округлюється в більший бік. Якщо менше, то в менший бік.
2.5.round # => 3
2.49.round # => 2
Округлення до заданої кількості десяткових знаків виконується шляхом передачі додаткового параметра:
2.456.round(2) # => 2.46
.floor
Метод floor округлює число вниз до найближчого цілого, незалежно від значення дробової частини. Він аналогічний методу Math.floor в JavaScript.
2.9.floor # => 2
-2.1.floor # => -3
.ceil
Метод ceil, навпаки, округлює число вгору до найближчого цілого, незалежно від дробової частини. Аналог методу Math.ceil в JavaScript.
2.1.ceil # => 3
-2.9.ceil # => -2
.truncate
Метод truncate відкидає дробову частину числа і повертає лише цілу частину. Він схожий на метод Math.trunc в JavaScript.
2.9.truncate # => 2
-2.9.truncate # => -2
Округлення до певної кількості знаків після коми (Ruby)
Якщо вам потрібно округлити число до певної кількості знаків після коми, Ruby також дозволяє це за допомогою методу round. Параметр у дужках вказує, скільки знаків залишити після коми.
Як і в JavaScript, округлення в Ruby також може призводити до неочікуваних результатів через використання чисел з плаваючою комою. Наприклад у старих версіях Ruby (2.+):
(1.005).round(2) # => 1.0 (очікується 1.01)
Наразі у мене стоїть ruby 3.2.1 (2023-02-08 revision 31819e82c8) +YJIT [x86_64-darwin23] і цієї проблеми не бачу:
(1.005).round(2)
=> 1.01
Оці нюанси з округленням доволі часто можуть бути підніматись під час технічних співбесід. Тож це треба пропрацювати, зрозуміти та запам'ятати (і слідкувати за оновленнями). Ми ж не хочемо щоб тривіальна помилка з округленням привела нас до проблем у production середовищі.
Цей блок містить всю необхідну інформацію для правильного цитування, включаючи дату публікації, назву допису, URL та інше.
Зверніть увагу, що посилатись потрібно на автора/авторку контенту (профіль, окремий допис тощо), а сайт цейво (tseivo.com) - лише майданчик для розміщення публікацій.
💡 Архівування сторінки у веб-архіві, такому як Wayback Machine, є корисною практикою, коли ви посилаєтесь на неї. Це дозволить зберегти стан сторінки на цей час і знизить ризики від зміни контенту або зміни структури сайту у майбутньому.
Автор/авторка пише під псевдонимом і не оприлюднює своє справжнє ім'я. Завжди перевіряйте достовірність контенту використовуючи декілька джерел (навіть, якщо контент опублікован під справжнім ім'ям).
Про зображення:
На нашій платформі ми приділяємо особливу увагу правильному вказуванню джерел зображень, щоб забезпечити дотримання авторських прав і прав на використання контенту. Ми намагаємося мотивувати використовувати виключно власні зображення, ресурси, що відповідають принципам fair use, або безкоштовні зображення з ліцензіями на кшталт Unsplash, які дозволяють вільне використання без порушення прав інтелектуальної власності.
Однак, враховуючи масштаб нашої платформи та різноманітність контенту, ми не можемо повністю контролювати всі публікації користувачів. Тому ми рекомендуємо перевіряти права на використання зображень та дотримуватися відповідних ліцензій, щоб уникнути можливих порушень авторських прав.
Інформація на сайті tseivo.com є суб'єктивною та відображає особисті погляди та досвід авторів та авторок блогів.
Використовуйте цей ресурс як одне з декількох джерел інформації під час своїх досліджень та прийняття рішень. Завжди застосовуйте критичне мислення. Людина сама несе відповідальність за свої рішення та дії.