The analyzer has detected a code fragment where the ==, ===, !=, or !== operators are used to compare floating-point numbers. Such code may be erroneous.
The example:
let result = x * y;
if (result === 0.1) { // <=
....
}
The condition result === 0.1 will almost never be true. The reason is that JavaScript, as per the IEEE 754 standard, can only represent the number 0.1 as its closest possible approximation: 0.1000000000000000055511151231257827021181583404541015625. It is very unlikely that arithmetic operations will produce exactly the same result.
To fix this, compare the difference between the values against a defined precision:
let result = x * y;
if (Math.abs(result - 0.1) < Number.EPSILON) { // <=
....
}
This approach works well for numbers of small orders of magnitude (for more details on this issue, see the official documentation: Number.EPSILON). A broader option is to compare both the absolute and relative errors between two numbers:
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)) {
....
}
This diagnostic rule is classified as:
Was this page helpful?
Your message has been sent. We will email you at
If you do not see the email in your inbox, please check if it is filtered to one of the following folders: