2012-09-08 62 views
0

好吧,我試圖計算兩個值的百分比。這應該很簡單,但由於一些奇怪的原因,它不起作用。我太累了/笨拙地弄清楚了。 這裏是我的代碼,它一直返回0,我在調試時檢查了值,而FilesCompleted是295,TotalFilesCount是25002,returnvalue var只是0,它應該是1。簡單的計算不起作用的某種原因

private int CalculatePercentComplete(int FilesCompleted, int TotalFilesCount) 
     { 
      int returnvalue = (FilesCompleted/TotalFilesCount) * 100; 

      if (returnvalue > 100 || returnvalue < 1) return 1; 
      else return returnvalue; 
     } 

回答

12

我檢查的值,同時調試和與FilesCompleted爲295和TotalFilesCount爲25002的返回值var爲只是0,它應該是1已經。

不,因爲所有的算術都是用整數完成的。所以首先這個表達式求值:

(FilesCompleted/TotalFilesCount) 

這是295/25002.這整數算術0的結果...當你再乘以100,在你已經仍然得到0。最簡單的解決方法是隻先做乘法:

int returnvalue = (FilesCompleted * 100)/TotalFilesCount; 

注意,如果FilesCompletedint.MaxValue/100大於溢出。你可以在浮點運算解決,通過任一做的一切:

int returnvalue = (int)((FilesCompleted * 100.0)/TotalFilesCount); 

...或使用long整數運算:

int returnvalue = (int)((FilesCompleted * 100L)/TotalFilesCount); 

這些都不是必要的,如果你不希望有當然,這是瘋狂的文件數量。 (你可以多達4200萬個文件...)

作爲一個方面說明,你的參數名稱違反了.NET命名約定。他們應該是駱駝 - totalFilesCountfilesCompleted

+1

恩,有趣的是,這是我還不知道的東西。 – user1071461

2

事實上,簡單的錯誤,當用int進行轉換時,答案將是一個int。您的答案將介於0和1之間,所以向下舍入爲0(int)。

用途:

int returnvalue = (int)((FilesCompleted/(double)TotalFilesCount) * 100); 

爲了使您的計算使用雙的分數,然後乘上100並強制轉換成int類型。

+0

我的不好,修正了它,() – SynerCoder

3

如何

int returnvalue = (int)(((double)FilesCompleted/TotalFilesCount) * 100); 

這是什麼東西做的

  1. 轉換int FilesCompleted到double。例如,如果它的295,那麼這將把它轉換成295.0,所以分割發生在兩倍。

    沒有必要將TotalFilesCount轉換爲double,因爲div整數(或double整數)返回double。

  2. 所以返回的雙倍結果是0。011799056075513958其由100

  3. multipled所以retunred結果是1.1799056075513958其最終轉化爲int返回1

2

FilesCompleted/TotalFilesCount回報0.01在INT格式是0,嘗試FilesCompleted*100/TotalFilesCount

相關問題