2016-03-19 2 views
5

У меня проблема с сопоставлением двух переменных типа «Реал». Один из них - результат математической операции, хранящейся в наборе данных, второй - значение поля редактирования в форме, преобразованное StrToFloat и сохраненное в «Реальная» переменная. Проблема заключается в следующем: 121,97 not equal to 121,97Delphi - сравнение двух переменных «реального»

Как вы можете видеть, программа пытается сказать мне, что 121,97 не равна 121,97 ... Я прочитал this topic, и я не уверен, copletely , что это та же проблема. Если бы это было так, не были бы и номерами, хранящимися в переменных, как точно такое же самое ближайшее представимое число, которое для 121.97 равно 121.96999 99999 99998 86313 16227 83839 70260 62011 71875?

Теперь предположим, что они не хранятся как одно и то же самое самое представимое число. Как узнать, как именно они хранятся? Когда я смотрю в окне отладки «CPU», я полностью теряюсь. Я вижу адреса, где эти значения должны быть, но ничто не похоже на какое-то двоичное, шестнадцатеричное или какое-либо представление фактического числа ... Я признаю, что расширенная отладка неизвестна для меня ...

Редактировать: эти два значения действительно немного отличаются.

enter image description here

ОК, мне не нужно, чтобы понять все. Хотя я не имеем дело с деньгами, там будет максимум 3 знака после запятой, так что «валюта» является выход

КСТАТИ: Расчет:

DATA[i].Meta.UnUsedAmount := DATA[i].AMOUNT - ObjQuery.FieldByName('USED').AsFloat; 

В этом случае 3695 - 3573,03

+0

См. JIRA RSP-13792. Вы можете вызвать функцию 'comparevalue'. – Magoo

+2

@Magoo Этот отчет фиктивный. Компилятор ведет себя корректно. –

+1

'StrToFloat' должен вести себя так, как вы говорите.Но как насчет другой ценности? Как он рассчитывается. Я думаю, вы должны сосредоточиться на реальной проблеме, которую мы не можем видеть. –

ответ

9

По неизвестным причинам вы не можете просмотреть значение float (single/double или real48) в виде шестнадцатеричного в списке часов.

Однако вы все еще можете просмотреть шестнадцатеричное представление, просмотрев его как дамп памяти.
Вот как: Добавить переменную в список просмотра.
правой кнопкой мыши на часах -> Edit Watch ...
Посмотреть как memory dump

enter image description here

Теперь вы можете сравнить два значения в отладчике.

Никогда не используйте поплавки для денежных сумм
Вы знаете, конечно, что вы не должны использовать поплавки считать деньги.
Вы столкнетесь со всеми неприятностями с округлением, и сравнения не будут работать так, как вы хотите их тоже.
Если вы хотите работать с деньгами, используйте вместо этого тип currency. Он не имеет этих проблем, поддерживает 4 десятичных разряда и может сравниваться с помощью оператора = без проблем округления.

В вашей базе данных используются типы данных money или currency.

+0

Вы можете во многих случаях сравнивать поплавки для равенства –

+0

Да, но не тогда, когда вы работаете с деньгами. Обновлен ответ. Если вы точно не знаете, что вы делаете, то сравнение сравнений с поплавками - это рецепт бедствия – Johan

+0

Спасибо! Можно ли кратко описать, что я просматриваю в дампе памяти? Мне очень жаль, но я не успел разобраться ... Я имею в виду - шестнадцатеричное представление 121.97 равно 0x42f3f0a4 ... –

Смежные вопросы