
Привіт друзі! Досліджував вчора нетривіальний і повчальний баг.
Написали замовники, що при тестуванні нової фічі менеджер банку не може схвалити список певних фінансових операцій. Одразу ж дивлюсь логи – а там чисто 🤷♂️ Звісно, могли просто не залогувати, або може і помилка – не помилка, а просто неправильні дані. Про всяк випадок намагаюсь відтворити на DEV’і – все працює.
Щоб зрозуміти, що ж відбувається, дзвоню розробнику, дивимось код. Знаходимо, що на певному етапі алгоритм перевіряє, що дані, що схвалюються менеджером (відображаються на UI) відповідають даним в базі (щоб не можна було обманути систему).
Як я і думав, проблема в даних! Перевіряю поле за полем – але все ідентичне. Як так?
Повертаюсь до логів і нарешті знаходжу root cause – класична проблема javascript. За вимогами, ми всі суми грошей округляємо до 2 знаків після коми, тобто, до копійок / центів. всі поля на UI налаштовані показувати рівно стільки. Бекенд теж округляє. Але коли JS бере дані з форми і пхає їх в json, то замість умовної суми 999.99 ми отримуємо 999.9900000001. Бекенд перевіряє – суми різні, дані різні, зупиняє процес. Все, як запрограмовано 😄
Які висновки?
✅ завжди перевіряйте округлення дробів. Я вже стільки багів на цьому зловив
✅ хороша практика розробки – кожна дія має мати видимий результат. Навіть, якщо алгоритм зупинився згідно вимог, застосунок має сигналізувати, що він зупинився і чому. Просто пофіксити округлення – недостатньо, тому завів CR на відповідне повідомлення
А які у вас є байки про баги, пов’язані з JS?
А як на рахунок того, щоб зберігати/пересилати дані в копійках/центах, щоб уникнути заокруглень?
коли справа дійде до кредитів/депозитів, все одно дроби з’являться, і їх треба правильно округляти