Реалізація калькулятора в мобільному додатку
Калькулятор виглядає тривіально — поки не потрібно підтримати ланцюжки операцій, обробляти втрату точності при операціях з плаваючою точкою і не отримати від QA баг «0.1 + 0.2 = 0.30000000000000004». Ми розробляємо кастомні калькулятори під ключ, гарантуючи точність обчислень і надійну архітектуру. Наш досвід — понад 6 років у мобільній розробці, більше 30 проєктів з кастомною логікою розрахунків. Зв'яжіться з нами для консультації — розберемо ваш use case.
Чому точність обчислень критична для мобільного калькулятора?
Найважливіше рішення — де рахувати. Вбудовані типи Double / Float дають IEEE 754 floating-point з відомими обмеженнями. Для фінансового калькулятора або бухгалтерського додатку це неприйнятно. На iOS правильний шлях — NSDecimalNumber або Decimal з Foundation. Decimal(string: "0.1") + Decimal(string: "0.2") дає рівно 0.3. Для складних виразів — NSExpression або власний парсер з токенізатором. На Android — java.math.BigDecimal з явним вказанням MathContext.DECIMAL128 і RoundingMode.HALF_UP при діленні. Ділити BigDecimal без MathContext — ArithmeticException при нетермінуючому десятковому результаті (наприклад, 1/3).
Для парсингу виразів виду 2 + 3 * 4 з пріоритетом операторів — алгоритм сортувальної станції (shunting-yard) Дейкстри. Реалізується приблизно за 100 рядків, не потребує сторонніх залежностей, покривається unit-тестами на кожен edge case. Альтернатива — бібліотека exp4j на Android або MathParser.org-mXparser для кросплатформи.
Як архітектура кінцевого автомата спрощує розробку?
Архітектурно калькулятор — кінцевий автомат. Стани: idle, enteringFirstOperand, operatorEntered, enteringSecondOperand, resultDisplayed, error. Переходи між станами при кожному натисканні кнопки. Зберігати просто currentInput: String і operator: String — шлях до багів при серії натискань оператора підряд або натисканні = без другого операнда. На iOS — ViewModel з @Published властивостями або Combine. На Android — ViewModel + StateFlow. У Flutter — BLoC або ChangeNotifier. Логіка обчислень — в окремому use case / сервісі, покритому тестами без залежності від UI. Архітектура на SwiftUI і Combine забезпечує реактивне оновлення UI без зайвих ререндерів.
Клавіатура: LazyVGrid у SwiftUI або GridLayout у Compose найпростіше. Єдиний нюанс — кнопка 0 зазвичай займає подвійну ширину, що потребує GridItem з span або окремого HStack для останнього рядка.
Що дає використання BigDecimal і Decimal на практиці?
Уявіть додаток для розрахунку відсотків за кредитом. Якщо черговий платіж обчислюється через Double, накопичується помилка порядку 0.01 за місяць. За рік — вже 0.12, а за 10 років — 12. Для банків це неприпустимо. Використання Decimal/BigDecimal дає копійчану точність на всьому терміні, і баланс сходиться з обліковою системою банку.
Типові edge cases та їх рішення
| Проблема | Рішення |
|---|---|
| Декілька точок у числі | Перевіряти перед додаванням символу . |
| Ділення на нуль | Відобразити «Помилка», дати почати заново |
| Переповнення відображення | Обмежити кількість цифр (наприклад, 12) |
Ланцюжок операторів (5 + 3 * 2) |
Зліва направо або з пріоритетом — залежить від ТЗ |
Втрата точності при 0.1 + 0.2 |
Використовувати Decimal / BigDecimal |
Чому варто замовити розробку у нас?
- Понад 6 років досвіду в iOS/Android/Flutter.
- Більше 30 успішних проєктів з кастомною логікою.
- Гарантія точності (0.1+0.2 = 0.3).
- Сертифікати Apple Developer та Google Play.
- Індивідуальний підхід — зв'яжіться, оцінимо ваш проєкт безкоштовно.
Процес роботи над кастомним калькулятором
- Аналітика — узгоджуємо математичні операції, пріоритети, обробку помилок, UI/UX.
- Проєктування — кінцевий автомат, ViewModel, тести на крайові випадки.
- Реалізація — парсер, точні обчислення, клавіатура, SwiftUI/Compose.
- Тестування — unit-тести, UI-тести, перевірка з плаваючою точкою.
- Деплой — App Store Connect / Google Play Console, TestFlight, Firebase Distribution.
Строки: базовий калькулятор з чотирма діями — від 1 дня. Науковий з пріоритетом операторів, історією та BigDecimal — від 2 до 3 днів.
Що входить у роботу
- Вихідний код з коментарями.
- Набір unit-тестів (покриття >90%).
- Документація по станах і переходах.
- Доступ до репозиторію (GitHub/GitLab).
- Інтеграція з CI/CD (опціонально).
- Підтримка після деплою (2 тижні).
Порівняння бібліотек для парсингу виразів
| Критерій | Власний shunting-yard | exp4j (Android) | mXparser (кросплатформа) |
|---|---|---|---|
| Розмір | ~100 рядків | ~200 КБ | ~1 МБ |
| Залежності | Немає | Немає | Немає |
| Розширюваність | Повна | Обмежена | Середня |
| Підтримка дужок | Так | Так | Так |
| Точність | IEEE 754 / BigDecimal | Double | Double / BigDecimal |
Власний парсер краще підходить для простих калькуляторів — він швидший і не додає зайвих залежностей. Для наукових з функціями на кшталт sin/cos — mXparser або exp4j.
Отримайте консультацію з архітектури вашого калькулятора. Пишіть — розберемо всі edge cases разом.







