你可以用数学计算出来。首先,得到
value
和
step
,然后确定
步
减去
value % step
从
价值
对于低数字,并添加
步
对于较高的值,则为低值。
然后确定哪个数字更接近
价值
然后返回(但首先乘以
价值
):
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 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...");
}
输出