Ich habe den folgenden einfachen Code:
int speed1 = (int)(6.2f * 10);
float tmp = 6.2f * 10;
int speed2 = (int)tmp;
speed1
und speed2
sollte den gleichen Wert haben, aber in der Tat habe ich:
speed1 = 61
speed2 = 62
Ich weiß, ich sollte wahrscheinlich Math.Round anstelle von Casting verwenden, aber ich würde gerne verstehen, warum die Werte unterschiedlich sind.
Ich habe mir den generierten Bytecode angesehen, aber bis auf einen Speicher und eine Ladung sind die Opcodes dieselben.
Ich habe den gleichen Code auch in Java ausprobiert und erhalte 62 und 62 korrekt.
Kann das jemand erklären?
Bearbeiten: Im realen Code ist es nicht direkt 6.2f * 10, sondern ein Funktionsaufruf * eine Konstante. Ich habe folgenden Bytecode:
für speed1
:
IL_01b3: ldloc.s V_8
IL_01b5: callvirt instance float32 myPackage.MyClass::getSpeed()
IL_01ba: ldc.r4 10.
IL_01bf: mul
IL_01c0: conv.i4
IL_01c1: stloc.s V_9
für speed2
:
IL_01c3: ldloc.s V_8
IL_01c5: callvirt instance float32 myPackage.MyClass::getSpeed()
IL_01ca: ldc.r4 10.
IL_01cf: mul
IL_01d0: stloc.s V_10
IL_01d2: ldloc.s V_10
IL_01d4: conv.i4
IL_01d5: stloc.s V_11
wir können sehen, dass Operanden Floats sind und dass der einzige Unterschied der ist stloc/ldloc
.
Was die virtuelle Maschine betrifft, habe ich es mit Mono / Win7, Mono / MacOS und .NET / Windows versucht, mit den gleichen Ergebnissen.