Строка неправильно конвертируется в float? (Blitzmax - Размышления) - PullRequest
0 голосов
/ 29 сентября 2011

У меня есть небольшая проблема в 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 Ответ

0 голосов
/ 29 сентября 2011

Как вы, наверное, знаете, ваш компьютер хранит числа в двоичном коде, используя ограниченный размер. 40.6 в двоичном виде - это периодическая последовательность (101000.1001100110011001100..., бесконечно), аналогичная тому, что происходит, когда вы пытаетесь записать цифры 1/3), повторяющаяся и, следовательно, не может быть точно представлена, поэтому вы получаете ошибки округления.

Количество правильных цифр, которые вы здесь получаете, похоже, что вы используете числа с плавающей запятой одинарной точности, вы можете отодвинуть ошибку дальше, удвоив ее, но она не исчезнет.

Для справки, вы можете найти Википедию с плавающей запятой полезной.

...