将数字舍入到最接近的100,1000和所有的通用解决方案?

时间:2014-07-02 10:08:21

标签: c# math rounding

我正在开发一个应用程序,其中需要以下面的方式舍入数字:

  1. 45 50
  2. 150 200
  3. 201 400
  4. 461 500
  5. 502 1000
  6. 560 1000
  7. 我可以使用以下代码来舍入到1000和5000。

    if (maxValue < 10000)
    {
        modifiedMaxvalue = (int)Math.Ceiling(dMax / 1000) * 1000;
    }
    else
    {
        modifiedMaxvalue = (int)Math.Ceiling(dMax / 5000) * 5000;
    }
    

    是否有一种通用的方式我们可以达到相同的数十,数百......直到数百万?

1 个答案:

答案 0 :(得分:3)

这可以解决您的问题标题,但不完全是您的示例所示:

public static int RoundUp(int value) {
  int n = 10;
  while (n * 10 < value) n *= 10;
  return (value + n - 1) / n * n;
}

它会返回以下结果:

 45  ->   50
150  ->  200
201  ->  300
461  ->  500
502  ->  600
560  ->  600

还有:

        4 ->        10
     2506 ->      3000
    15700 ->     20000
   258000 ->    300000
  5870000 ->   6000000
 38780000 ->  40000000
308700000 -> 400000000

编辑:

这是一个更安全的版本,对于非常大的值,它不会进入无限循环:

public static int RoundUp(int value) {
  long n = 10, v = value;
  while (n * 10 < v) n *= 10;
  return (int)((v + n - 1) / n * n);
}

这可以处理最多2000000000的值(因为任何超过它的值将会舍入到无法表示为int的值):

1705600000 -> 2000000000