C# 尝试创建将浮点插值为零的函数

C# 尝试创建将浮点插值为零的函数,c#,unity3d,lerp,C#,Unity3d,Lerp,我试图创建一个平滑函数,将一个数字插值为零。问题是,它不起作用。在这种情况下,如果我将一个数字增加0.01指定的次数,我希望将该数字减少0.02,直到它为零。这是我的功能 float ReduceSpeed(float x) { if (x != 0f) { if (x % 0.02f != 0 && x > 0) { x = x - 0.01f; } else if (x % 0.02

我试图创建一个平滑函数,将一个数字插值为零。问题是,它不起作用。在这种情况下,如果我将一个数字增加0.01指定的次数,我希望将该数字减少0.02,直到它为零。这是我的功能

float ReduceSpeed(float x)
{
    if (x != 0f)
    {
        if (x % 0.02f != 0 && x > 0)
        {
            x = x - 0.01f;
        } else if (x % 0.02f != 0 && x < 0)
        {
            x = x + 0.01f;
        }
        else
        {
            if (x > 0f)
            {
                x = x - 0.02f;
            }
            else
            {
                x = x + 0.02f;
            }
        }
    }
    return x;
}
float ReduceSpeed(浮点x)
{
如果(x!=0f)
{
如果(x%0.02f!=0&&x>0)
{
x=x-0.01f;
}否则如果(x%0.02f!=0&&x<0)
{
x=x+0.01f;
}
其他的
{
如果(x>0f)
{
x=x-0.02f;
}
其他的
{
x=x+0.02f;
}
}
}
返回x;
}

我想用它来创建一种统一的滑动运动。

问题很可能在于直线

if (x != 0f)
由于舍入误差,
x
很可能不完全为零,因为0.01和0.02是基数2中的周期数。您应该选择一个小值(ε),将
x
的绝对值与之进行比较,例如

if (Math.Abs(x) < 1E-10)
if(数学Abs(x)<1E-10)

问题很可能出在线路上

if (x != 0f)
由于舍入误差,
x
很可能不完全为零,因为0.01和0.02是基数2中的周期数。您应该选择一个小值(ε),将
x
的绝对值与之进行比较,例如

if (Math.Abs(x) < 1E-10)
if(数学Abs(x)<1E-10)

或不要对浮点数使用模(%)运算符,除非您确实需要它并且知道它的限制。几乎从来都不需要它。有什么理由避免使用Lerp或SmoothDamp吗?不要对浮点数使用模(%)运算符,除非您确实需要它并且知道它的限制。它几乎从来都不需要。你有什么理由避免Lerp或SmoothDamp吗?