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方法对其进行四舍五入,并通过将其乘以该次方来恢复大小
与前面的答案非常相似…其中一种方法可能是
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 toint
没有任何作用。我在另一个答案中尝试了日志版本,但由于一些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);
}