定时器在0.29后停止

nic*_*ael 20 javascript timer

    <head>
    <script>
        window.setInterval(function(){timer()},100);
        function timer()
            {
                document.getElementById("timer").innerHTML=
               (parseInt(document.getElementById("timer").innerHTML*100)+1)/100;
            }
    </script>
    </head>
    <body>
        <div id="timer">0.000</div>
    </body>
Run Code Online (Sandbox Code Playgroud)

如您所见,计时器最多只计算0.29.

为什么?

MrC*_*ode 25

这是因为浮点数学与你的数学相结合的方式parseInt().请参阅浮点数学是否已损坏.

当它达到时0.29,它确实0.29 x 100会产生,29但实际上它是:

console.log(0.29 * 100);
28.999999999999996
Run Code Online (Sandbox Code Playgroud)

接下来,将它转换为一个整数,使用parseInt()该整数导致28(删除所有小数位),最后1通过100生成结果进行加法和除法,0.29并且在计时器的每个刻度上重复此操作,数字不能增加.

最好将原始值存储为变量并使用它来输出.toFixed(2),而不是使用UI上的数字作为源.像这样:

小提琴

var num = 0.00;

window.setInterval(function () {
    timer();
}, 100);

function timer() {
    num = ((num * 100) + 1) / 100;
    document.getElementById("timer").innerHTML = num.toFixed(2);
}
Run Code Online (Sandbox Code Playgroud)

  • 做好准备 在10秒内授予我的赏金. (3认同)
  • `parseInt`在这里并不多余,它是问题的根源,因为它删除了最终导致数字保持在"0.29"的小数位.如果你删除`parseInt()`,计数器继续超过`0.29`(尽管显示完整的小数位). (2认同)