🐴🔎 Дело о 0.1 + 0.2

Есть маленький эксперимент, который можно провести прямо сейчас. Открываем DevTools → Console и вводим: 0.1 + 0.2 Браузер покажет: 0.30000000000000004 А если проверить: 0.1 + 0.2 === 0.3 получим: false Что вообще происходит? Компьютер разучился считать? 🙂 Нет. Здесь всё упирается в двоичную систему. Мы привыкли к десятичной системе: используем цифры от 0 до 9, а после запятой у нас идут десятые, сотые, тысячные: 0.1 = 1/10 0.01 = 1/100 0.001 = 1/1000 Для нас 0.1 — совершенно обычное конечное число. Но компьютер внутри работает с двоичными числами — только 0 и 1. В двоичной системе после точки используются уже другие доли: 1/2 1/4 1/8 1/16 ... Например: 0.5 = 1/2 0.25 = 1/4 0.125 = 1/8 И эти числа можно представить в двоичной системе точно. А вот 0.1 — это 1/10. Его невозможно точно записать конечным количеством двоичных цифр. Его двоичная запись будет бесконечной: 0.1₁₀ = 0.000110011001100110011...₂ Компьютер не может хранить бесконечное количество цифр, поэтому сохраняет ближайшее доступное значение. То же самое происходит с 0.2. А когда эти значения складываются, получается число, которое очень близко к 0.3, но не идеально равно ему. Поэтому: 0.1 + 0.2 === 0.3 даёт: false Причём пользователь может вообще этого не заметить. Например: (0.1 + 0.2).toFixed(2) вернёт: "0.30" На экране мы увидим: 0.30 ₽ А внутри вычислений при этом может находиться значение с небольшой погрешностью. И вот здесь начинается практическая часть. Представим интернет-магазин: цена → скидка → комиссия → итоговая сумма Если такие расчёты выполнять обычными числами с плавающей точкой и не учитывать особенности их точности, небольшие погрешности могут накапливаться или влиять на сравнение чисел. Например, программа ожидает одно значение, а получает очень близкое к нему, но формально другое. Поэтому для денежных расчётов используют специальные подходы: например, хранят сумму в минимальных единицах как целое число: 19.99 ₽ → 1999 копеек или используют типы для точной десятичной арифметики. И вот что здесь интересно с точки зрения QA. На экране: 19.99 ₽ Внутри системы: 19.990000000000002 Пользователь видит одно и то же значение. А программа при определённых операциях может получить уже другой результат. 🐴 Иногда баг прячется не в том, что программа показывает неправильное число. А в том, как это число представлено внутри. #QA #Тестирование #Программирование #JavaScript #Backend #DevTools

🐴🔎 Дело о 0.1 + 0.2 | Сетка — социальная сеть от hh.ru 🐴🔎 Дело о 0.1 + 0.2 | Сетка — социальная сеть от hh.ru