Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Почему 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 и следующим числом — для сравнения дробных чисел.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.