如何获取最接近我的数字的特定步骤的值
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" 可能是错误的词,但我找不到合适的词来解释。我希望我的例子能让我的问题更清楚。
如果有人知道如何更清楚地解释它(包括更改标题),欢迎编辑
你可以用数学来计算。先求出value
和step
的绝对值,然后用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;
}
我有一个任意数值(浮点数)和一个任意步长(也是一个浮点数)。
我想在台阶上找到最接近数值的数字,而不是走很远的路(一直走到我到达它)
示例: 步骤是5 值为 1038
步数为 0 - 5 - 10 - 15 - ... - 1035 - 1040 - ...
因此最接近的值是 1040。这很容易通过循环找到,只需搜索我的数字之前的最后一个值,之后的第一个值,然后选择更接近的值。
但这是 O(n),我想要更快的东西(有时步非常小而值非常大,这必须非常快地完成 UI 反应)。
有没有办法只通过计算而不用循环来做到这一点?
编辑:不需要从 0 开始。步长可以是负数或正数(但是 -40 的步长会给出与 40 的步长完全相同的结果)。如果通过巧妙的计算而不是循环来完成,则不需要起点。
英语不是我的母语。我很清楚 "step" 可能是错误的词,但我找不到合适的词来解释。我希望我的例子能让我的问题更清楚。
如果有人知道如何更清楚地解释它(包括更改标题),欢迎编辑
你可以用数学来计算。先求出value
和step
的绝对值,然后用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;
}