0

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

let cid = 0.5;

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

kertAW
  • 2,443

2 Answers2

1

Дело в том, что число хранится в памяти в бинарной форме, но дроби (в вашем случае 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); }

2ip
  • 586
  • 2
  • 11
1

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

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

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