在相同的范围内将数字舍入到最接近的5或10的倍数,具体取决于第一个

时间:2017-02-10 16:51:37

标签: c# rounding

我正在开发统计应用,但我有一个舍入问题。 我想显示一个图表,其中多个点都连接到行。 为了能够自动调整比例,我想进行某种计算。我已经弄清楚要做什么,但我无法将其正确地翻译成代码。

所以这就是我想做的事情: 我查看我的值列表以找到最大值。 在我的图形中,我有6条参考线。因此,我将我的价值除以少于多少的头寸,以确保我得到的价值(当乘以实际的头寸数量时)将大于我的最大金额,以便我的行不会#39;超出我的图形。

一旦我有这个值,我需要在相同的范围内得到最接近的5或10的整数(取决于第一个)。

所以给你一些例子:

example 1:
initial value = 685425
divided value = 685425/5 = 137085 => rounded value = 150000

example 2:
initial value = 53
divided value = 53/5 = 10.6 => rounded value = 15

example 3:
initial value = 8215
divided value = 8215/5 = 1643 => rounded value = 2000

所以我总是四舍五入到最接近的5或10的倍数,但是在相同的范围内。

如何将其放入代码?

谢谢你, 肯尼斯

1 个答案:

答案 0 :(得分:1)

public static int GetLimit(int v)
{
    int by5 = v / 5;

    // for too small numbers we return early
    if (by5 < 0) return 0;
    if (by5 < 5) return 5;
    if (by5 < 10) return 10;

    int log = (int)Math.Log10(by5) - 1;
    int scope = (int)Math.Pow(10, log);
    int tmp = by5 / scope;
    tmp = 5 * ((tmp/5) + 1);
    return tmp * scope;
}

这使用十进制对数来得到&#34;范围&#34; (scope)。然后它将该数字除以该范围以得到前两位数,&#34;轮数&#34;它们到5的下一个倍数(5*((tmp/5) + 1))并再次乘以范围以回到范围。

对于数字太小(低于50),它会提前返回,因为scope会变为0,这会导致DivideByZeroException

Console.WriteLine(GetLimit(685425));
Console.WriteLine(GetLimit(53));
Console.WriteLine(GetLimit(8215));
Console.WriteLine(GetLimit(11));
Console.WriteLine(GetLimit(2));

结果

150000
15
2000
5
5

使用Math.LogMath.Pow的替代方法是将分割后的数字转换为带有前两位数字和长度的字符串。我没有测试这是否会更快,但我不这么认为。如果这对性能至关重要,则需要对其进行测试。