Saya memiliki kode sederhana berikut:
int speed1 = (int)(6.2f * 10);
float tmp = 6.2f * 10;
int speed2 = (int)tmp;
speed1
dan speed2
harus memiliki nilai yang sama, tetapi pada kenyataannya, saya punya:
speed1 = 61
speed2 = 62
Saya tahu saya mungkin harus menggunakan Math.Round daripada casting, tapi saya ingin mengerti mengapa nilainya berbeda.
Saya melihat bytecode yang dihasilkan, tetapi kecuali store dan load, opcodesnya sama.
Saya juga mencoba kode yang sama di java, dan saya mendapatkan 62 dan 62 dengan benar.
Adakah yang bisa menjelaskan hal ini?
Sunting: Dalam kode asli, itu tidak langsung 6.2f * 10 tetapi panggilan fungsi * sebuah konstanta. Saya memiliki bytecode berikut:
untuk 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
untuk 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
kita dapat melihat bahwa operan mengapung dan satu-satunya perbedaan adalah stloc/ldloc
.
Sedangkan untuk mesin virtual, saya mencoba dengan Mono / Win7, Mono / MacOS, dan .NET / Windows, dengan hasil yang sama.