2012-09-27 64 views
4

下面我有一個方法,我從互聯網上搜索來計算C#中Excel的百分比函數。我修改了一下,以適應我的程序,但沒有改變主要邏輯。參數接受錯誤的類型,仍然運行良好 - 爲什麼?

該程序編譯並運行良好沒有任何錯誤(我知道)。然而進一步檢查我的代碼,在我的主,我請使用

 double result = percentRank(array, x); 

其中

x是一個int
陣列是列表中的功能(INT)

它是一種不同類型的比percentRank方法指定要採取的,但它仍然運行良好。我的問題是爲什麼?

 private static double percentRank(List<int> array, double x) 
     { 
      //  Calculate the PERCENTRANK(array, x) 
      //If X matches one of the values in the array, this function is 
      //equivalent to the Excel formula =(RANK(x)-1)/(N-1) where N is the number of data points. 
      //If X does not match one of the values, then the PERCENTRANK function interpolates. 
      // http://www.pcreview.co.uk/forums/algorithm-computing-excel-percentrank-t946312.html 


      array.Sort(); 

      double result = 0; 
      bool foundX = false; 

      for (int index = 0; index < array.Count; index++) 
      { 
       if (array[index] == x) 
       { 
        result = ((double)index)/((double)array.Count - 1); 
        foundX = true; 
        break; 
       } 
      } 
      // calculate value using linear interpolation 

      if (foundX == false) 
      { 
       double x1, x2, y1, y2; 

       x1 = x2 = x; 

       for (int i = 0; i < array.Count - 1; i++) 
       { 
        if (array[i] < x && x < array[i + 1]) 
        { 
         x1 = array[i]; 
         x2 = array[i + 1]; 
         foundX = true; 
         break; 
        } 
       } 

       if (foundX == true) 
       { 
        y1 = percentRank(array, x1); 
        y2 = percentRank(array, x2); 

        result = (((x2 - x) * y1 + (x - x1) * y2))/(x2 - x1); 
       } 
       else 
       { 
        // use the smallest or largest value in the set which ever is closer to valueX 

        if (array[0] > x) 
        { 
         result = 0; 
        } 
        else 
        { 
         result = 1; 
        } 
       } 
      } 

      return result; 
     } 

編輯:好的答案是隱式類型轉換。我可以禁用它嗎?我不喜歡它,因爲它可能會產生一些我不知道的錯誤。

+0

我真的不明白這個問題。雖然你的變量被稱爲「數組」,但它確實是一個列表,所以函數開始被稱爲正確的類型。這看起來很不錯,但我強烈建議你將你的參數名稱改爲更好的東西(比如cellValueList,這樣你就知道數據來自哪裏)。 –

+0

@BenjaminDangerJohnson他問爲什麼他可以傳遞一個'Int32'到一個定義爲'Double'(「x」,而不是「array」)的參數 –

+0

是不是要重構這個方法? – nan

回答

11

我的問題是爲什麼?

您可以將整數分配給雙精度值。 C#將隱含地從Int32轉換爲Double

你可以在這裏看到:

double value = 3; 

這是允許的,因爲相同的隱式轉換。沒有這種轉換,你必須鍵入:

double value = 3.0; 

這是在C#語言規範規定,部分「6.1.2隱式數值轉換」

的隱式數值轉換爲:

...

  • 從int到long,float,double或decimal。
+0

謝謝,愚蠢的問題 - >我可以禁用這種隱式轉換嗎?因爲它可能在我的程序中引入錯誤,我不知道? –

+0

@ClaytonLeung號這是語言本身的一部分。如果您將其傳遞給一個,則「Int32」總是隱式轉換爲「Double」。 –

2

C#編譯器正在執行隱式強制轉換操作。一個double可以保存任何整數值。

1

有一個implicit轉換從intdouble

轉換是隱式的,因爲double可以保持int的值而不會失去準確性。

有一個explicit從double轉換爲int,但沒有implicit轉換。原因是,如果你在一個int中存儲了一個double,那麼當它切斷小數位時會出現數值的丟失。

MSDN有關於轉換的一個良好的書面記錄:http://msdn.microsoft.com/en-us/library/ms173105.aspx

0

int可以隱式轉換爲double。這就是這裏發生的事情。

相關問題