Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';从C#中的两个整数创建百分比值的最佳方法是什么?_C#_.net_Casting - Fatal编程技术网

什么';从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
文字。谢谢你的回答!到处投票!你的公式不对,也不起作用。有关正确的公式和解释,请参见我的答案。