Цикл while в какой-то момент начинает отнимать не то число, которое указано в теле js
Вроде бы очень простой цикл, не могу понять, почему так происходит. Заранее спасибо за объяснение.
let cid = 0.5;
while (cid > 0) {
cid -= 0.01;
console.log(cid);
}
Ответы (2 шт):
Дело в том, что число хранится в памяти в бинарной форме, но дроби (в вашем случае 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);
}
Это происходит потому, что число хранится в памяти в бинарной форме, как последовательность бит – единиц и нулей. Но дроби на самом деле являются бесконечной дробью в двоичной форме.
Для того, что бы обойти проблему нужно округлить результат используя метод toFixed(n).
let cid = 0.5;
while (cid > 0) {
cid -= 0.01;
console.log(cid.toFixed(2));
}