0

ブリッツマックスで少し問題があります。INI ファイルを読み取ろうとしましたが、float を読み取ると、非常に奇妙な方法で変換されます。関連するファイルの行は、たとえば次のようになります。

_fStrength=40.6

この出力は次のようになります。

DebugLog:_fStrength: 40.5999985

私が読むために使用するコードは、リフレクションで動作し、次のようになります。

For Local fld:TField = EachIn id.EnumFields()
            fld.Set(obj, SearchInFile("TempWeapon" + index, fld.Name(), "Weapons.ini"))
            DebugLog(fld.Name() + ": " + String(fld.Get(obj)))
        Next

これは、「。」の後の数字が次の場合にのみ発生することがわかりました。は 5 または 0 と等しくありません。反射を使用しない場合は正常に動作するため、この動作を説明することはできません。

誰か助けてくれませんか?

4

1 に答える 1

1

ご存じのとおり、コンピュータは限られたサイズを使用して数値をバイナリ コードで保存します。40.6バイナリで展開された は、周期的なシーケンス ( 101000.1001100110011001100..., 無限) であり、 ) の数字を書き留めようとしたときに起こることと同様に、1/3) の繰り返しで正確に表すことができないため、丸め誤差が発生します。

ここで取得した正しい桁数は、単精度浮動小数点数を使用しているように見えます。2 倍にするとエラーをさらに戻すことができますが、消えません。

参照として、浮動小数点に関するウィキペディアが役立つ場合があります。

于 2011-09-29T07:17:26.163 に答える