2010-12-02 7 views
10

code VB.NET:Pourquoi ce code renvoie-t-il des valeurs différentes? (C# et 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 

retour: 113,25: -163,5

C# Code:

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(); 
    } 
} 

retours 0: 0

Je ne comprends pas, j'apprécierais une explication.

Répondre

18

C# / effectue une division entière, tronquant la partie fractionnaire. VB.NET génère implicitement Double.

Pour effectuer la division à virgule flottante, jeté à un type à virgule flottante:

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

Merci pour votre aide. – tryingit

+1

Vous êtes les bienvenus! –

9

C# littéraux comme 0 et 512 sont de type int. Tout int/int (int divisé par int) entraîne une division entière, ce qui supprime tout reste fractionnel, perdant ainsi sa précision. Si vous utilisez des littéraux float comme 0F au lieu de 0 et 512F au lieu de 512, alors C# effectuera la division en virgule flottante, qui conservera la partie fractionnaire.

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(); 
} 
+1

Merci pour votre aide aussi. – tryingit

+0

tryit, vous êtes les bienvenus. bonne chance. –