Вебинар: Стратегия без иллюзий: как превращать цели в результаты - 19.08
Анализатор обнаружил фрагмент кода, где для сравнения чисел с плавающей точкой используются операторы ==, ===, !=, !==. Такой код может содержать потенциальную ошибку.
Рассмотрим пример:
let result = x * y;
if (result === 0.1) { // <=
....
}
Условие result === 0.1 практически никогда не будет истинным. Это связано с тем, что согласно стандарту IEEE 754, JavaScript представляет число 0.1 лишь как максимально приближенное к нему значение: 0.1000000000000000055511151231257827021181583404541015625. Вероятность получить точно такой же результат после арифметических операций крайне мала.
Исправить ошибку можно, сравнивая разность значений с заданной точностью:
let result = x * y;
if (Math.abs(result - 0.1) < Number.EPSILON) { // <=
....
}
Данный способ проверки подходит для чисел малых порядков (подробнее об этой проблеме можно прочитать в официальной документации: Number.EPSILON). Более универсальный вариант проверки — сравнение и абсолютной, и относительной погрешностей двух чисел:
function nearlyEqual(a, b,
relEpsilon = 4 * Number.EPSILON,
absEpsilon = Number.EPSILON
) {
if (a === b) {
return true;
}
if (Number.isNaN(a) || Number.isNaN(b)) {
return false;
}
let difference = Math.abs(a - b);
if (difference <= absEpsilon) {
return true;
}
let maxAbsoluteValue = Math.max(Math.abs(a), Math.abs(b));
return difference / maxAbsoluteValue <= relEpsilon;
}
let result = x * y;
if (nearlyEqual(result, 0.1)) {
....
}
Диагностическое правило классифицируется как:
Была ли полезна эта страница документации?
Мы ответим вам на:
Если вы так и не получили ответ, пожалуйста, проверьте, отфильтровано ли письмо в одну из следующих стандартных папок: