2017-02-10 273 views
1

我正在研究一个统计数据应用程序,并且遇到舍入问题。 我想显示一个图表,它有多个点都连接到线。 为了能够自动调整比例,我想执行某种计算。我已经想出了要做什么,但是我无法正确地将它翻译成代码。将数字舍入到最接近的5或10的倍数,取决于最先的数字

所以,这就是我想要做的: 我通过我的值列表来查找最大的值。 在我的图形中,我有6条参考线。所以我把我的价值除以一位数以下的头寸,以确保我得到的价值(乘以实际的头寸数量)将大于我的最大金额,这样我的行不会不要超出我的图形。

一旦我有这个值,我需要在相同的范围内得到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
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; 
} 

它使用十进制数,以获得 “范围”(scope)。然后它将该范围除以该范围以获得前两位数字,将它们“舍入”到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将分割数转换为字符串工作与最早出现的两个数字和的长度。我没有测试这是否会更快,但我不这么认为。如果这对性能至关重要,则需要对其进行测试。

相关问题