JS следует 32-битному представлению с плавающей запятой для чисел.
Из 32-битных:
1 - это знаковый бит. (число отрицательное, если значение равно 1),
8 битов указывают значение экспоненты (e), а другие
23 биты представляют значение дроби.

С 32 битами значение вычисляется по этой серьезной формуле:

При использовании десятичных дробей эта система счисления с плавающей запятой вызывает некоторые ошибки округления в JavaScript. Например, 0,1 и 0,2 не могут быть представлены точно. Следовательно, 0,1 + 0,2 === 0,3 дает ложь.

Чтобы действительно понять, почему 0,1 не может быть правильно представлено как 32-битное число с плавающей запятой, вы должны понимать двоичный код. Для представления многих десятичных знаков в двоичном формате требуется бесконечное количество цифр, потому что двоичные числа представлены степенью 2 n (2ˆn), где n - целое число. При попытке вычислить 0,1 длинное деление будет продолжаться бесконечно.

Вычисление 0,1 (1/10) дает неопределенное количество десятичных знаков.

Более подробно проверьте частоту ошибок при преобразовании десятичных чисел в двоичные по этой ссылке

Теперь вопрос в том, можем ли мы решить эту проблему?
- Да. Мы можем и будем.

Для этого мы воспользуемся Number.EPSILON.

Number.EPSILON возвращает наименьший интервал между двумя представимыми числами. Это полезно для проблемы с приближением с плавающей запятой.

ШАГИ ВНУТРИ ФУНКЦИИ после вызова numberEquals (0,1 + 0,2, 0,3):
= Math.abs ((0,1 + 0,2) - 0,3) ‹Number.EPSILON
= Math.abs ((0,30000000000000004) - 0,3) ‹Number.EPSILON
= Math.abs ((5.551115123125783e-17) - 0,3)‹ Number.EPSILON
= Math.abs ((5.551115123125783e-17) - 0,3) ‹2.220446049250313e-16

Следовательно, он вернул «true».

Эта функция работает, проверяя, меньше ли разница между двумя числами, чем Number.EPSILON. Помните, что Number.EPSILON - это наименьшая разница между двумя представимыми числами. Разница между 0,1 + 0,2 и 0,3 будет меньше, чем Number.EPSILON.

❤️ Спасибо, что добрались до конца. Престижность вам. Хлопните и поделитесь им, чтобы показать свою поддержку и любовь 👏🎯