将任何n位数字舍入为(n-1)个零位数

时间:2011-01-05 05:56:52

标签: c# vb.net rounding

很抱歉很难制定。

我需要像这样回合:

12 -> 10
152 -> 200
1538 -> 2000
25000 -> 30000
etc. 

扭曲我的头,却看不出怎么做到这一点。必须适用于任意n位数。任何人都有一个优雅的方法吗?

c#或vb.net

6 个答案:

答案 0 :(得分:4)

这个怎么样:

        double num = 152;

        int pow = (int)Math.Log10(num);

        int factor = (int)Math.Pow(10, pow);

        double temp = num / factor;

        double result = Math.Round(temp) * factor;

答案 1 :(得分:3)

我认为你应该尝试这样的事情:

public int Round( int number)
{
    int power = number.ToString().Length - 1;
    int sz = Math.Pow(10, power);

    int rounded = (int)Math.Round( number / sz );

    return rounded * sz;
}

这个想法是获得最接近的10次幂的大小,可以用表示为字符串的数字的长度来获得。然后将该数除以该幂,将其保留为1,2,然后使用Math.Round方法将其舍入,并通过将其重新乘以幂来恢复大小。

就像之前的回答一样......

答案 2 :(得分:1)

我会这样做:

double d = 25000;
int power = d.ToString().Length - 1;
double multipler = Math.Pow(10,power);
d = Math.Round(d / multipler) * multipler;
Console.WriteLine(d);

答案 3 :(得分:0)

其中一种方式可能是

  1. 将数字转换为十进制
  2. 除以10 ^(n-1)(其中n是位数)
  3. 现在使用圆函数(Decimal.Round
  4. 再乘以10 ^(n-1)

答案 4 :(得分:0)

int MakeOneSigFig(int value)
{
    int neg = 1;
    if(value <= 10 && value >= -10) { return value; }
    if(value == int.MinValue) { value = int.MaxValue; neg = -1; }
    if(value < 0) { value = -value; neg = -1; }

    int mult = 10; // start at 10 because we've got 'firstDigit = value / 10' below
    while(value > 99) { value /= 10; mult *= 10; }
    int firstDigit = value / 10;
    if(value % 10 >= 5) firstDigit++;
    return neg * firstDigit * mult;
}

这相当于MidpointRounding.AwayFromZero。此方法不进行任何双重数学或字符串转换。如果您不想循环,可以使用下面的if块替换它。这将更有效,但代码更多,而且不易阅读。

if(value < 100) { mult = 10; }
else if(value < 1000) { mult = 100; value /= 10; }
else if(value < 10000) { mult = 1000; value /= 100; }
else if(value < 100000) { mult = 10000; value /= 1000; }
// etc.

答案 5 :(得分:0)

将数字除以10n并舍入结果,然后将结果乘以10n;

int MyRound(int num)
{
    double divisor = Math.Pow(10, num.ToString().Length - 1);
    return (int)(Math.Round(num / divisor, MidpointRounding.AwayFromZero) * divisor);
}

请注意,由于默认银行家的四舍五入,我们应该在舍入时使用MidpointRounding.AwayFromZero