7
C#Float式:結果のfloatをintにキャストするときの奇妙な動作
次の簡単なコードがあります: int speed1 = (int)(6.2f * 10); float tmp = 6.2f * 10; int speed2 = (int)tmp; speed1speed2同じ値でなければなりませんが、実際には次のようになっています。 speed1 = 61 speed2 = 62 キャストではなくMath.Roundを使用する必要があることはわかっていますが、値が異なる理由を理解したいと思います。 生成されたバイトコードを見ましたが、ストアとロードを除いて、オペコードは同じです。 私はjavaでも同じコードを試しましたが、62と62を正しく取得しました。 誰かがこれを説明できますか? 編集: 実際のコードでは、直接6.2f * 10ではなく、関数呼び出し*定数です。私は次のバイトコードを持っています: のために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 …