在C#中从两个整数创建百分比值的最佳方法是什么?

我有两个整数,我想划分得到一个百分比。

这就是我现在所拥有的:

int mappedItems = someList.Count(x => x.Value != null); int totalItems = someList.Count(); (int)(((double)mappedItems /(double) totalItems) * 100) 

这给出了正确的答案。 但这需要做很多事情来做一些简单的事情,比如两个数字之间的百分比。

有一个更好的方法吗? 什么东西不涉及铸造?

如何只是mappedItems * 100.0 / totalItems并将其转换为适当的类型?

如果你只是想避免演员表,你可以写:

 (100 * mappedItems) / totalItems 

但是当mappedItems > int.MaxValue / 100时,它会很快溢出。

这两种方法都将百分比降低了。 为了得到正确的舍入,我会将结果保持为double:

 ((double)mappedItems /(double) totalItems) * 100 

通过适当舍入获得百分比的唯一整数方法是:

 int result = ( mappedItems * 200 + totalItems ) / ( totalItems * 2 ); 

我们怎么去那里? 如果我们以浮点forms做这件事,那就是Math.Floor( mappedItems * 100.0 / totalItems + 0.5 ) 。 我们需要将此公式转换为仅整数,方法是将0.5乘以totalItems,然后将0.5 * totalItems移动到被除数中,然后将除数和除数乘以2以使分数消失:

mappedItems * 100.0 / totalItems + 0.5 => mappedItems * 100.0 / totalItems + totalItems * 0.5 / totalItems =>(mappedItems * 100.0 + 0.5 * totalItems)/ totalItems =>(mappedItems * 200.0 + totalItems)/(totalItems * 2)。

此时公式仅为整数。 当我们进行整数除法时,我们得到了浮点结果,所以只有整数的结果相当于上面提到的浮点数。

只使用整数运算就可以获得正确的舍入结果:

 int percent = (200 * mappedItems + 1) / (totalItems * 2); 

通过乘以2,加1并除以2,可以有效地增加一半。 这使得整数除法进行舍入而不是截断。

好吧,假设你的计数小于int.MaxValue:

 int percent = mappedItems * 100 / totalItems; 

您可以使用(mappedItems * 100)/ totalItems但这总是向下舍入。 您使用的方法更好。 为什么不将代码作为方法包装?

只是添加一下,因为你已经得到了int并且想要计算百分比(浮点值),你将不得不进行投射。 无论是在C#中显式还是在某些脚本语言中都是隐式的,演员表仍然会发生。 最好将其明确化。

如果你想要编写每行代码更少的强制转换:

 double mappedItems = (double)someList.Count(x => x.Value != null); double totalItems = (double)someList.Count(); double percentage = (mappedItems / totalItems) * 100.0); 

虽然正如其他人所指出的那样 – 检查totalItems是否为0(最好在转换为加倍之前)以避免除以零。

试试这个:

 int mappedItems = someList.Count(x => x.Value != null); int totalItems = someList.Count(); int percent = Convert.ToInt32(complete * 100.0 / total); 

在这个例子中,你得到的结果是“50”

 int mappedItems = 14; int totalItems = 28; int result = Convert.ToInt32(mappedItems * 100.0 / totalItems); // result is 50