我在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。 我无法解释这种行为,因为如果我不使用反射,它就可以正常工作。
有人可以帮我吗?
答案 0 :(得分:0)
您可能知道,您的计算机使用有限的大小以二进制代码存储数字。以二进制方式扩展的40.6
是一个周期性序列(101000.1001100110011001100...
,无限地),类似于当您尝试记下1/3
的数字时重复发生的情况,因此无法准确表示,所以你得到舍入错误。
您在这里获得的正确数字的数量看起来就像您使用的是单精度浮点数,您可以通过转换为双倍来进一步推回错误,但它不会消失。
作为参考,您可能会发现Wikipedia on floating point有帮助。