C# 将任意n位数字四舍五入为(n-1)零位

C# 将任意n位数字四舍五入为(n-1)零位,c#,vb.net,rounding,C#,Vb.net,Rounding,对不起,很难说清楚 我需要像这样转一圈: 12 -> 10 152 -> 200 1538 -> 2000 25000 -> 30000 etc. 扭动我的头,但不知道怎么做。必须适用于任意n个数字。有人有优雅的方法吗 c#或vb.net我认为您应该尝试以下内容: public int Round( int number) { int power = number.ToString().Length - 1; int sz = Math.Pow(10,

对不起,很难说清楚

我需要像这样转一圈:

12 -> 10
152 -> 200
1538 -> 2000
25000 -> 30000
etc. 
扭动我的头,但不知道怎么做。必须适用于任意n个数字。有人有优雅的方法吗


c#或vb.net

我认为您应该尝试以下内容:

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方法对其进行四舍五入,并通过将其乘以该次方来恢复大小


与前面的答案非常相似…

其中一种方法可能是

  • 将数字转换为十进制
  • 除以10^(n-1)(其中n为位数)
  • 现在使用round函数()
  • 再乘以10^(n-1)
  • 这个怎么样:

            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;
    

    我会这样做:

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

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

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

    请注意,由于默认的银行舍入,在舍入时,我们应该使用
    中点舍入。远离零

    实际上,您是舍入到最重要的数字mm。。真正地已经好几年没上学了:)按照惯例,sz是匈牙利符号中字符串的前缀。谢谢!节省了我一点时间和痛苦:)这只适用于正整数。如果number<0,则添加一个guard子句
    ,然后抛出某种类型的异常。对我来说,使用
    Math.Log10
    比使用
    number.ToString.Length
    更干净,这样做不会进行适当的舍入
    number/sz
    int/int
    ,它将是一个整数除法,它进行截断,而不是四舍五入。
    Math.Round
    和cast back to
    int
    没有任何作用。我在另一个答案中尝试了日志版本,但由于一些3位数字,它给出了0。看来这是个错误,但我没有时间找出原因。
    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.
    
    int MyRound(int num)
    {
        double divisor = Math.Pow(10, num.ToString().Length - 1);
        return (int)(Math.Round(num / divisor, MidpointRounding.AwayFromZero) * divisor);
    }