2009-10-12 35 views
1

下面是一小段代碼,當它調用它輸出'double'時。爲什麼?這背後的理由是什麼?爲什麼不打印'浮動'?在C#中調用Double&Float方法參數時執行的代碼#

class source 
{ 

    static void Main() 
    { 
     Receiver r = new Receiver(); 


     r.Method1(1.1); 
    } 

} 

class Receiver 
{ 
    public virtual void Method1(double f) { Debug.Print("double"); } 
    public virtual void Method1(float f) { Debug.Print("float"); } 
} 

TIA

+0

明白了,感謝傢伙們的啓示 – SoftwareGeek 2009-10-12 22:24:46

+0

這可能也與窄和寬轉換有關,並且可以安全地默認爲加倍 – SoftwareGeek 2009-10-12 22:29:16

+2

「雙」是默認的原因是因爲(1)雙是遠,遠更精確,(2)double幾乎不會比float更慢,有時更快。爲什麼它更快?因爲執行浮點運算的芯片幾乎總是在雙打中進行所有內部操作;浮動操作需要將浮動轉換爲雙打,在雙打中進行操作,然後在完成後將其更改回浮動。除非你打算分配數以百萬計的這些傢伙,否則幾乎肯定不會受到雙打的內存限制,所以用它們代替浮游物。 – 2009-10-13 06:56:49

回答

13

要指定浮動通話這樣的:

r.Method1(1.1f); 

否則它會默認爲翻一番,像你這樣的觀察。

這裏的MSDN documentation的雙一porition這可以解釋爲什麼:

默認情況下,一個真正的數字文字上 賦值運算符 的右側作爲雙面處理。

+0

謝謝傑伊,但它爲什麼默認爲雙? – SoftwareGeek 2009-10-12 22:19:40

+0

按設計。看我的編輯。 – 2009-10-12 22:20:17

+0

@SoftwareGeek:'float'文字1.1f實際上代表數量'9,227,469 * 2 ^( - 23)',因爲所有'浮點'數字必須表示爲一個值的兩倍的冪(0 .. 2^24)。 「double」文字1.1表示一個分數,其值接近11/10的數學值。請注意,將浮點值賦給double值是一件非常合理的事情,它不應該需要類型轉換(但是)。將浮動分配給雙打是狡猾的,應該需要一個類型轉換(但不是)。 – supercat 2012-05-23 21:01:22

5

double是非整數的默認類型。所以1.1是一個double,1.1m是一個小數,1.1F是一個float。

相關問題