This question already has answers here:
Is floating point math broken?
                                
                                    (31个答案)
                                
                        
                                4年前关闭。
            
                    
让我进一步解释我的问题。
假设我的速度为-5.4028000,我希望它像这样回到零。

-5.4,
-5.3,
-5.2
...
-0.2,
-0.1,
0


与正数相同。为了使它们返回0,以0.1为一组。每次运行时它将返回0。因为这将放置在更新循环中。

我尝试过的事情:

if(vx > 0)
{
    vx-=0.1;
}
if(vx < 0)
{
    vx+=0.1;
}


但这只是将我的VX锁定为:

VX:0.04999999

要么

VX:0.09999999

最佳答案

您的数字未恢复为零的原因是,由于舍入误差,最后的减法可能是减去了错误的数字。由于5.4和0.1都不能精确地用double格式表示,因此您的最后一次减法(或在负数的情况下最后一次加法)将“过冲”。

这是Math.min(...)Math.max(...)的问题。基本上,我们将只增加或减去我们需要达到零的确切数量。

if (vx > 0) {
    vx -= Math.min(0.1, vx);
}
if (vx < 0) {
    vx += Math.min(0.1, -vx);
}

07-26 03:49