Почему 0.1 + 0.2 не равно 0.3 и что с этим делать
Короткий ответ
Дробные числа хранятся в двоичном виде, и некоторые из них, как 0.1, точно не записываются. Округляйте результат при выводе:
console.log(0.1 + 0.2);
console.log(Number((0.1 + 0.2).toFixed(2)));Результат:
0.30000000000000004
0.3Сравнение дробных
Не сравнивайте дробные числа через ===. Проверяйте, что разница крошечная:
const equal = (a, b) => Math.abs(a - b) < Number.EPSILON;
console.log(0.1 + 0.2 === 0.3);
console.log(equal(0.1 + 0.2, 0.3));Результат:
false
trueДеньги в центах
Для денег считайте в целых центах и переводите в доллары только в конце:
const prices = [19.99, 5.01, 0.1];
const totalCents = prices.reduce((sum, price) => sum + Math.round(price * 100), 0);
console.log(totalCents / 100);Результат:
25.1Частая ошибка
Ошибка накапливается, когда вы складываете много дробей в цикле:
let sum = 0;
for (let i = 0; i < 10; i++) sum += 0.1;
console.log(sum);Результат:
0.9999999999999999Функции из этого ответа
- Number.prototype.toFixed — Форматирует число с заданным количеством знаков после запятой.
- Math.round — Округляет число до ближайшего целого.
- Number.EPSILON — Наименьшая разница между 1 и следующим числом — для сравнения дробных чисел.