[英]What's the best way to create a percentage value from two integers in 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)mappedItems /(double) totalItems) * 100
通過適當的舍入獲得百分比的正確整數方法是:
int result = ( mappedItems * 200 + totalItems ) / ( totalItems * 2 );
我們怎么去那里? 如果我們用浮點數做這件事,那就是Math.Floor( mappedItems * 100.0 / totalItems + 0.5 )
。 我們需要通過將 0.5 乘以和除以 totalItems,然后將 0.5 * totalItems 移動到被除數,然后將被除數和除數都乘以 2 來使分數消失,從而將這個公式轉換為僅整數:
映射項目 * 100.0 / 總項目 + 0.5 => 映射項目 * 100.0 / 總項目 + 總項目 * 0.5 / 總項目 => (映射項目 * 100.0 + 0.5 * 總項目 ) / 總項目 => (映射項目 * 200.0 + 項目總數 *2) / (
此時,公式僅為整數。 當我們做整數除法時,我們得到了地板結果,所以只有整數的結果等價於提到的浮點數。
僅使用整數運算即可獲得正確舍入的結果:
int percent = (200 * mappedItems + 1) / (totalItems * 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
這對我有用。
double percentage = (double) (mappedietms * 100) / totalitems;
label6.Text = $@"健康:[{Math.Round(percentage,1)}]";
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.