0

我在 Blitzmax 中有一个小问题。我尝试读取一个 INI 文件,如果我读取浮点数,它们会以一种非常奇怪的方式进行转换。文件中相关的行如下所示:

_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) 重复的数字时发生的情况,因此无法准确表示,因此会出现舍入错误。

您在此处获得的正确位数看起来就像您使用的是单精度浮点数,您可以通过将错误推回两倍,但它不会消失。

作为参考,您可能会发现Wikipedia on floating point很有帮助。

于 2011-09-29T07:17:26.163 回答