Строка неправильно преобразована в число с плавающей точкой? (Blitzmax - Размышления)
У меня есть небольшая проблема в 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. Я не могу объяснить это поведение, потому что, если я не использую отражения, он работает нормально.
Может ли кто-нибудь помочь мне, пожалуйста?
1 ответ
Как вы, вероятно, знаете, ваш компьютер хранит числа в двоичном коде, используя ограниченный размер. 40.6
в двоичном виде это периодическая последовательность (101000.1001100110011001100...
(бесконечно), аналогично тому, что происходит, когда вы пытаетесь записать цифры 1/3
) повторяется и, таким образом, не может быть представлен точно, поэтому вы получаете ошибки округления.
Число правильных цифр, которое вы здесь получаете, выглядит так, как будто вы используете числа с плавающей запятой одинарной точности, вы можете отодвинуть ошибку дальше, удвоив ее, но она не исчезнет.
Для справки, вы можете найти Wikipedia по плавающей запятой полезной.