Округления

Как часто вы сталкиваетесь с проблемой мантиссы в своем коде?

возьмем простой, и всем довольно известный пример const result = 0.1 + 0.2 console.log(result) // 0.30000000000000004

Здесь вылазит пример "проблема дробных вычеслений". Тут можно почитать как происходит такое преображение

JS имплементирует IEEE 754 стандарт, описывающий представления чисел с плавающей точкой. Этот стандарт также описывет: - мантисса, экспонента, знак числа - представление положительного и отрицательного нуля, бесконечностей, нечило (NaN) и другие константы - методы для преобразования числа при мат.операциях - исключительные ситуации: деление на ноль, переполнение, потеря значимости - операции( такие как сложение, вычитание и пр.) Не знаю как у вас обстоят дела, а у нас используется JS для автотестов. В нашем коде мы обязаны проверять калькуляции, где каждая копеечка должна сходится.

И тут мы можем погрузится в удивительный мир из 2 зол, чтобы решить эту проблему - символическая алгебра. - приближенная алгебра

символичесвую алгебру реализовать сложнее. Зачет того, что мы работаем со строками, как с математическими операндами и функциями. Такая алгебра по сути используется в школе. Например (x+y)^2 (сумма квадратов). Такую вещь мы можем даже разложить на x^2 + 2xy + y^2. Такую алгебру реализует такаие библиотеки, как SymPy, matlab, matplotlib

Приближенную алгебру реализовать проще, засчет того, что мы смотрим на числа, их кол-во знаков после запятой и исползуя эту информацию мы результат приблежаем к наибольшему кол-ву знаков, что у нас есть. Дешево и сердито. Проблема с 0.1+0.2 решена! Такую алгебру несложно сделать самому. Если мы говорим про JS то тут есть такие библиотеки как mathjs, decimal.js, bignumber.js.

Есть и другие варианты алгебры, но эти 2 варианта самые распространенные. Мы выбрали библиотеку bignumber.js.

P.S. проблема с 0.1+0.2 не только преследует JS, но и Java, C, Fortran и многие другие ЯП, которые используют стандарт IEEE 754.

#js

@haradkou_sdet