Aşağıdaki basit koda sahibim:
int speed1 = (int)(6.2f * 10);
float tmp = 6.2f * 10;
int speed2 = (int)tmp;
speed1
ve speed2
aynı değere sahip olmalı, ama aslında:
speed1 = 61
speed2 = 62
Muhtemelen döküm yerine Math.Round kullanmam gerektiğini biliyorum, ancak değerlerin neden farklı olduğunu anlamak istiyorum.
Oluşturulan bayt koduna baktım, ancak bir mağaza ve bir yük dışında işlem kodları aynı.
Aynı kodu java'da da denedim ve 62 ve 62'yi doğru bir şekilde aldım.
Biri bunu açıklayabilir mi?
Düzenleme: Gerçek kodda, doğrudan 6.2f * 10 değil, bir işlev çağrısı * sabittir. Aşağıdaki bayt koduna sahibim:
için 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
için 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
işlenenlerin float olduğunu ve tek farkın stloc/ldloc
.
Sanal makineye gelince, aynı sonuçlarla Mono / Win7, Mono / MacOS ve .NET / Windows ile denedim.