什么';从C#中的两个整数创建百分比值的最佳方法是什么?
我有两个整数,我想除以得到一个百分比 这就是我现在拥有的:什么';从C#中的两个整数创建百分比值的最佳方法是什么?,c#,.net,casting,C#,.net,Casting,我有两个整数,我想除以得到一个百分比 这就是我现在拥有的: int mappedItems = someList.Count(x => x.Value != null); int totalItems = someList.Count(); (int)(((double)mappedItems /(double) totalItems) * 100) 这是正确的答案。但是,要想在两个数字之间获得一个百分比,这是一件非常简单的事情 有更好的方法吗?一些不需要强制转换的东西?只需MappeI
int mappedItems = someList.Count(x => x.Value != null);
int totalItems = someList.Count();
(int)(((double)mappedItems /(double) totalItems) * 100)
这是正确的答案。但是,要想在两个数字之间获得一个百分比,这是一件非常简单的事情
有更好的方法吗?一些不需要强制转换的东西?只需
MappeItems*100.0/totalItems
并将其强制转换为适当的类型如何?您可以使用(MappeItems*100)/totalItems,但这总是四舍五入。你用的方法更好。为什么不将代码包装为一个方法?好吧,假设您的计数小于int.MaxValue:
int percent = mappedItems * 100 / totalItems;
如果您只是想避免强制转换,您可以写:
(100 * mappedItems) / totalItems
double mappedItems = (double)someList.Count(x => x.Value != null);
double totalItems = (double)someList.Count();
double percentage = (mappedItems / totalItems) * 100.0);
但当mappedItems>int.MaxValue/100
时,这将很快溢出
这两种方法都将百分比向下舍入。为了获得正确的四舍五入,我将结果保留为双精度:
((double)mappedItems /(double) totalItems) * 100
仅使用整数运算即可获得正确的四舍五入结果:
int percent = (200 * mappedItems + 1) / (totalItems * 2);
乘二,加一,除以二,实际上就是加了一半。这使得整型除法进行舍入而不是截断。只需将其相加,因为您得到了
int
s,并且想要计算您必须进行转换的百分比(浮点值)。无论是在C#中的显式转换,还是在某些脚本语言中的隐式转换,这种转换仍然会发生。最好把它说清楚
如果希望每行代码的强制转换次数更少,可以编写:
(100 * mappedItems) / totalItems
double mappedItems = (double)someList.Count(x => x.Value != null);
double totalItems = (double)someList.Count();
double percentage = (mappedItems / totalItems) * 100.0);
尽管如其他人所指出的那样-检查totalItems
是否为0(最好在转换为double之前),以避免被零除。尝试以下方法:
int mappedItems = someList.Count(x => x.Value != null);
int totalItems = someList.Count();
int percent = Convert.ToInt32(complete * 100.0 / total);
在本例中,结果为“50”
通过适当的舍入获取百分比的唯一正确整数方法是:
int result = ( mappedItems * 200 + totalItems ) / ( totalItems * 2 );
我们怎么去那里?如果我们用浮点运算,它将是Math.Floor(MappeItems*100.0/totalItems+0.5)
。我们只需要将这个公式转换为整数,方法是将0.5乘以totalItems,然后将0.5*totalItems移动到被除数中,然后将被除数和除数都乘以2,使分数消失:
MappeItems*100.0/totalItems+0.5=>MappeItems*100.0/totalItems+totalItems*0.5/totalItems=>(MappeItems*100.0+0.5*totalItems)/totalItems=>(MappeItems*200.0+totalItems)/(totalItems*2)
此时,公式仅为整数。当我们进行整数除法时,我们得到的结果是floorred结果,因此仅整数的结果与前面提到的浮点结果等价。这对我来说是有效的
double percentage = (double) (mappedietms * 100) / totalitems;
label6.Text=$@“运行状况:[{Math.Round(百分比,1)}]” 如果列表为空,请小心除以0。或者添加
M
后缀,如*100M
。原始解决方案允许MappeItems的值在完整范围内(Int32.MaxValue/Int32.MinValue)。您的解决方案将导致值溢出>(Int32.MaxValue/100)或<(Int32.MinValue/100)@Eduardo:当然!如果列表为空,则可以避免首先计算MappeItems
和totalItems
。如果MappeItems
的计算成本很高(但在本例中并非如此),这可能会有所帮助@弗兰克»这是真的,但有时可读性是维护时更重要的考虑因素。@Vaccano:M
后缀表示decimal
文字。谢谢你的回答!到处投票!你的公式不对,也不起作用。有关正确的公式和解释,请参见我的答案。