2010-12-02 108 views
10

VB.NET代碼:這段代碼爲什麼返回不同的值? (C#和VB.NET)

Module Module1 

Sub Main() 
    Dim x, y As Single 
    x = 0 + (512/2 - 407)/256 * 192 * -1 
    y = 0 + (512/2 - 474)/256 * 192 
    Console.WriteLine(x.ToString + ": " + y.ToString) 
    Console.ReadLine() 
End Sub 

End Module 

返回:113,25:-163,5

C#代碼:

class Program 
{ 
    static void Main(string[] args) 
    { 
     float x, y; 
     x = 0 + (512/2 - 407)/256 * 192 * -1; 
     y = 0 + (512/2 - 474)/256 * 192; 
     Console.WriteLine(x + ": " + y); 
     Console.ReadLine(); 
    } 
} 

返回0:0

我不明白,希望能有一個解釋。

回答

18

C#/執行整數除法,截取小數部分。 VB.NET隱式轉換爲Double

要執行浮點除法,轉換爲浮點類型:

static void Main(string[] args) 
    { 
     float x, y; 
     x = 0 + (512/2 - 407)/(float)256 * 192 * -1; 
     y = 0 + (512/2 - 474)/(float)256 * 192; 
     Console.WriteLine(x + ": " + y); 
     Console.ReadLine(); 
    } 
+2

感謝您的幫助。 – tryingit 2010-12-02 03:22:44

+1

非常歡迎您! – 2010-12-02 03:39:09

9

C#文字等0512int類型。任何int/int(int除以int)都會導致整數除法,從而丟棄任何小數餘數,從而失去精度。如果使用像浮點字符0F而不是0512F而不是512,那麼C#將執行浮點除法,這將保留小數部分。

static void Main(string[] args) 
{ 
    float x, y; 
    x = 0F + (512F/2F - 407F)/256F * 192F * -1F; 
    y = 0F + (512F/2F - 474F)/256F * 192F; 
    Console.WriteLine(x + ": " + y); 
    Console.ReadLine(); 
} 
相關問題