2016-05-04 9 views
6

Ich habe diesen Code;Variable, die merkwürdig wirkt (wie Fließkomma)

static int test = 100; 
     static int Test 
     { 
      get 
      { 
       return (int)(test * 0.01f); 
      } 
     } 

Ausgang: 0

Aber dieser Code gibt verschiedene

static int test = 100; 
    static int Test 
    { 
     get 
     { 
      var y = (test * 0.01f); 
      return (int)y; 
     } 
    } 

Ausgang: 1

Auch dieser Code Ich habe

static int test = 100; 
    static int Test 
    { 
     get 
     { 
      return (int)(100 * 0.01f); 
     } 
    } 

Ausgabe lautet: 1

Ich sehe IL-Ausgabe und ich verstehe nicht, warum C# diese mathematische Operation zur Kompilierzeit und Ausgabe anders machen? enter image description here

Was ist der Unterschied zwischen diesen beiden Codes? Warum ich mich entschieden habe, variable Ergebnisse zu verwenden, ändert sich?

+0

Wie überprüfen Sie Werte? – dotctor

+0

Mögliches Duplikat von [Ist Fließkomma-Mathe gebrochen?] (Http://stackoverflow.com/questions/588004/is-floating-point-math-broken) – Liam

+3

Ich habe mich nach einer SO umgeschaut, aber ich kann die nicht finden genaue Antwort. Diese Antwort kann jedoch Dinge ein wenig aufklären: http://Stackoverflow.com/a/15117741/2594485 –

Antwort

2

Weil der Compiler Sie trickst. Der Compiler ist schlau genug, um bereits einige Berechnungen durchzuführen, so dass dies zur Laufzeit nicht erforderlich ist, was sinnlos wäre. Der Ausdruck 100 * .01f wird im Compiler ohne den Mangel an Genauigkeit auf dem Float berechnet, die breaks you up on run-time.

Um dies zu beweisen, versuchen Sie, die static test eine const zu machen. Sie werden feststellen, dass der Compiler in der Lage ist, die Berechnung für Sie auch dann zu kompilieren. Es hat nichts mit dem Schreiben auf eine Variable zuerst, wie in Ihrer Probe. Laufzeit im Vergleich zur Kompilierzeit ist.

+0

Ok Ich verstehe.Aber das ist nicht meine Frage.Ich bekomme es.Compiler lösen konstante matematic Operationen zur Kompilierzeit.Dies muss wirklich sein.Aber wenn ich Variablen für diese Operation "Ergebnis" ändert sich? Ich denke, das ist falsch? Warum ändert sich das Ergebnis? Variablen nur ein Platzhalter habe ich recht? – Cevizli

+0

Nein. Es gibt einen Unterschied zwischen der Kompilierungszeitauflösung von konstanten Werten und der Laufzeitdarstellung. –