Округления
Как часто вы сталкиваетесь с проблемой мантиссы в своем коде?
возьмем простой, и всем довольно известный пример 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.
@haradkou_sdet
· 22.11
Я обычно делаю вычисления с фиксированной точкой в таких случаях. Проще говоря, считаю не в рублях, а в копейках, где величины становятся целыми. Да и вообще по возможности плавающей точки избегаю.
ответить
коммент удалён