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

时间:2010-01-23 18:53:35

标签: c# .net casting

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

这就是我现在所拥有的:

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

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

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

9 个答案:

答案 0 :(得分:45)

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

答案 1 :(得分:8)

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

(100 * mappedItems) / totalItems

mappedItems > int.MaxValue / 100时会很快溢出。

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

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

答案 2 :(得分:8)

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

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

我们如何到达那里?如果我们以浮点形式执行此操作,则为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)。

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

答案 3 :(得分:6)

只使用整数运算即可得到正确的舍入结果:

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

通过乘以2,加1并除以2,你实际上增加了一半。这使整数除法进行舍入而不是截断。

答案 4 :(得分:4)

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

int percent = mappedItems * 100 / totalItems;

答案 5 :(得分:1)

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

答案 6 :(得分:1)

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

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

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

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

答案 7 :(得分:1)

试试这个:

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

答案 8 :(得分:0)

这对我有用。

 double percentage = (double) (mappedietms * 100) / totalitems;

label6.Text = $@"健康:[{Math.Round(percentage ,1)}]";