如何获取最接近我的数字的特定步骤的值

How to Get the value on a specific step closest to my number

我有一个任意数值(浮点数)和一个任意步长(也是一个浮点数)。

我想在台阶上找到最接近数值的数字,而不是走很远的路(一直走到我到达它)

示例: 步骤是5 值为 1038

步数为 0 - 5 - 10 - 15 - ... - 1035 - 1040 - ...

因此最接近的值是 1040。这很容易通过循环找到,只需搜索我的数字之前的最后一个值,之后的第一个值,然后选择更接近的值。

但这是 O(n),我想要更快的东西(有时步非常小而值非常大,这必须非常快地完成 UI 反应)。

有没有办法只通过计算而不用循环来做到这一点?

编辑:不需要从 0 开始。步长可以是负数或正数(但是 -40 的步长会给出与 40 的步长完全相同的结果)。如果通过巧妙的计算而不是循环来完成,则不需要起点。

英语不是我的母语。我很清楚 "step" 可能是错误的词,但我找不到合适的词来解释。我希望我的例子能让我的问题更清楚。

如果有人知道如何更清楚地解释它(包括更改标题),欢迎编辑

你可以用数学来计算。先求出valuestep的绝对值,然后用value减去value % step求出step两边的数,求得小数,并将 step 添加到较低的数字以获得较高的数字。

然后只需确定哪个数字更接近value和return(但首先将其乘以value的符号):

static float GetClosestNumber(float value, float step)
{
    // Get the absolute values of our arguments
    var absValue = Math.Abs(value);
    step = Math.Abs(step);

    // Determing the numbers on either side of value
    var low = absValue - absValue % step;
    var high = low + step;

    // Return the closest one, multiplied by -1 if value < 0
    var result = absValue - low < high - absValue ? low : high;
    return result * Math.Sign(value);
}

这里有一点测试方法和相关class:

class Item
{
    public float Value { get; set; }
    public float Step { get; set; }
}

static void Main()
{
    var testItems = new List<Item>
    {
        new Item {Value = 1038, Step = 5},
        new Item {Value = .8f, Step = .25f},
        new Item {Value = .9f, Step = .25f},
        new Item {Value = -86, Step = -45},
        new Item {Value = -168, Step = -45},
        new Item {Value = -168, Step = 45},
    };

    foreach (var testItem in testItems)
    {
        Console.WriteLine("The closest number to {0}\twhen stepping by {1}\tis {2}", 
            testItem.Value, testItem.Step, GetClosestNumber(testItem.Value, testItem.Step));
    }

    GetKeyFromUser("\nDone! Press any key to exit...");
}

输出

怎么样:

        int step = 3;
        int value = 10;

        if ((value % step) == 0)
        {
            return value;
        }
        else
        {
            return ((value / step) + 1) * step;
        }