Цикл while в какой-то момент начинает отнимать не то число, которое указано в теле js

Вроде бы очень простой цикл, не могу понять, почему так происходит. Заранее спасибо за объяснение.

let cid = 0.5;

while (cid > 0) {
  cid -= 0.01;
  console.log(cid);
}


Ответы (2 шт):

Автор решения: 2ip

Дело в том, что число хранится в памяти в бинарной форме, но дроби (в вашем случае 0,01) в двоичной системе счисления являются бесконечными. В JavaScript нет возможности для хранения точных значений 0.1 или 0.2, используя двоичную систему, точно также, как нет возможности хранить одну третью в десятичной системе счисления. Подробнее можете почитать тут: https://learn.javascript.ru/number

Вы также можете исправить такое поведение переведя дробь в целое число, например, умножив на 100

let cid = 0.5*100;

while (cid > 0) {
  cid -= 0.01*100;
  console.log(cid/100);
}

→ Ссылка
Автор решения: Alex P

Это происходит потому, что число хранится в памяти в бинарной форме, как последовательность бит – единиц и нулей. Но дроби на самом деле являются бесконечной дробью в двоичной форме.

Для того, что бы обойти проблему нужно округлить результат используя метод toFixed(n).

let cid = 0.5;
while (cid > 0) {
  cid -= 0.01;
  console.log(cid.toFixed(2));
}

→ Ссылка