Задать вопрос
JackShcherbakov
@JackShcherbakov

Почему JS думает что 0.1 не равен 0.1?

Имеется:
код - https://codepen.io/CitizenOne/pen/mBeBao
Надо:
провестикорректную проверку переменных
Суть проблемы:
Для этого кода 0.1 и 0.1 разные числа

P.s - Перечитал кучу статей типа "Двоичное представление вещественных чисел
и ошибки округления
", но ни в одной не опсывалось как решить проблему. Все что я понял, что во всех языках програмирования в котороых используется двоичное представление
вещественных чисел имеется такой косяк. Но как это решить?

Заранее выражаю огромную благодарность!
  • Вопрос задан
  • 498 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
KorniloFF
@KorniloFF Куратор тега JavaScript
Работаю по font-end / JS
Пригласить эксперта
Ответы на вопрос 4
Sanasol
@Sanasol Куратор тега JavaScript
нельзя просто так взять и загуглить ошибку
использовать целые числа
использовать округление
Ответ написан
@Zzzz9
Вас что в школе не учили про точность? a=0.1 b=0.1 d=0.001 - точность
Если a-b по модулю < d то условие верно, вам до какого знака требуется точность?
Ответ написан
@4ainik
начинал с бейсика на 286 в 1994
Да, для дробных чисел есть такое, но это не косяк.

if( a == 1.0 )

Так лучше не делать и если вы написали программу и в настоящий момент это условие нормально работает то не факт, что в следующий раз оно не начнет "глючить".
Выход есть: заменить точное сравнение на совпадение, на сравнение с приближенной точностью:
if(abs(a - 1.0) < 0.001 )

т.е. в данном случае если разница (a - 1.0) меньше точности (0.001), то условие выполнится корректно...
Ответ написан
Комментировать
Ni55aN
@Ni55aN
Можно только определить по какой-то точности, но это значение зависит от величины чисел, которые использовались при вычислениях. Например
Не
x === y
а
Math.abs(x-y) < Number.EPSILON
Для этого примера ок, но если x=9.03-9.02, y=0.2-0.1. тогда не работает, и нужно брать точность побольше
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы