Вроде бы очень простой цикл, не могу понять, почему так происходит. Заранее спасибо за объяснение.
let cid = 0.5;
while (cid > 0) {
cid -= 0.01;
console.log(cid);
}
Вроде бы очень простой цикл, не могу понять, почему так происходит. Заранее спасибо за объяснение.
let cid = 0.5;
while (cid > 0) {
cid -= 0.01;
console.log(cid);
}
Дело в том, что число хранится в памяти в бинарной форме, но дроби (в вашем случае 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));
}
0.1+0.2 === 0.3 // false– Alexander Lonberg Apr 03 '21 at 09:05