Java 如何使一个数字缓慢地返回到零

Java 如何使一个数字缓慢地返回到零,java,math,Java,Math,让我进一步解释我的问题。 假设我的速度是-5.4028000,我希望它能像这样回到零 -5.4, -5.3, -5.2 ... -0.2, -0.1, 0 正数也一样。让它们以0.1为一组返回到0。每次运行时,它都会返回到0。因为这将被放置在更新循环中 我尝试过的事情: if(vx > 0) { vx-=0.1; } if(vx < 0) { vx+=0.1; } if(vx>0) { vx-=0.1; } 如果(vx0){ vx-=数学最小值(0.1,vx);

让我进一步解释我的问题。 假设我的速度是-5.4028000,我希望它能像这样回到零

-5.4,
-5.3,
-5.2
... 
-0.2,
-0.1,
0
正数也一样。让它们以0.1为一组返回到0。每次运行时,它都会返回到0。因为这将被放置在更新循环中

我尝试过的事情:

if(vx > 0)
{
    vx-=0.1;
}
if(vx < 0)
{
    vx+=0.1;
}
if(vx>0)
{
vx-=0.1;
}
如果(vx<0)
{
vx+=0.1;
}
但这只是将我的VX锁定在:

VX:0.0499999


VX:0.0999999

您的数字没有返回到零的原因是,由于舍入错误,最后一次减法可能减去了错误的数字。由于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);
}
if(vx>0){
vx-=数学最小值(0.1,vx);
}
如果(vx<0){
vx+=数学最小值(0.1,-vx);
}

您需要确保最终增量/减量不大于数字的大小:

if(vx > 0) {
    vx -= Math.min(0.1, vx);
}
if(vx < 0) {
    vx += Math.min(0.1, Math.abs(vx));
}
if(vx>0){
vx-=数学最小值(0.1,vx);
}
如果(vx<0){
vx+=数学最小值(0.1,数学绝对值(vx));
}

假设您想要每秒0.1的更改率,并且不使用任何花哨的库,您可以执行以下操作:

while (Math.abs(vx) - 0.1 > 0.0) {
    vx += -Math.signum(vx) * 0.1
    Thread.sleep(1000)
}
vx = 0.0;

如果你得到一个大于-0.1小于0.1的值,你希望发生什么?也许您应该实际使返回值与值成比例,例如
vx*=0.9抱歉,有人删除了他们的问题。是的,我会试试@JonSkeet.Nope,这是对奇怪的零点进行扩展。谢谢!这真是太棒了!实际上它运行得非常快,但是在第二种情况下是不起作用的——如果Vx= -0.05,那么Max.max(0.1,-0.05)将是0.1。因此,vx将变为0.05,然后在下一轮的第一个“如果”中递减。@BarrySW19这一问题现在已经解决了。@DasLinkedLight感谢您的修复。您可以使用
vx-=Math.copySign(Math.min(0.1,Math.abs(vx)),vx)自由分支…这也适用于使用Abs将其变为正值。不起作用-如果vx开始为0.15,则该值将在0.05和-0.05之间永久振荡。@BarrySW19 right,编辑了答案以修复它。