很抱歉很难制定。
我需要像这样回合:
12 -> 10
152 -> 200
1538 -> 2000
25000 -> 30000
etc.
扭曲我的头,却看不出怎么做到这一点。必须适用于任意n位数。任何人都有一个优雅的方法吗?
c#或vb.net
答案 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)
其中一种方式可能是
答案 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
。