簡體   English   中英

在 C# 中從兩個整數創建百分比值的最佳方法是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM