Mam problem z porównaniem dwóch zmiennych typu "Real". Jedna jest wynikiem operacji matematycznej, przechowywana w zbiorze danych, druga jest wartością pola edycyjnego w postaci, konwertowanego przez StrToFloat i zapisanego w zmiennej "Real". Problem jest następujący: Delphi - porównanie dwóch zmiennych liczb rzeczywistych
Jak widać, program próbuje mi powiedzieć, że nie jest równa 121,97 do 121,97 ... Przeczytałem this topic, i nie jestem pewien copletely , że to ten sam problem. Gdyby tak było, to nie byłyby to liczby przechowywane w zmiennych jako dokładnie ta sama najbliższa reprezentowalna liczba, która dla 122,97 wynosi 121.96999 99999 99998 86313 16227 83839 70260 62011 71875
?
Teraz powiedzmy, że nie są one przechowywane w tym samym najbliższym reprezentowanym numerze. Jak znaleźć, jak dokładnie są przechowywane? Kiedy patrzę w okno debugowania "CPU", jestem kompletnie zagubiony. Widzę adresy, gdzie powinny być te wartości, ale nic nie jest podobne do jakiejś binarnej, szesnastkowej czy jakiejkolwiek reprezentacji rzeczywistej liczby ... Przyznaję, że zaawansowane debugowanie jest dla mnie nieznanym wszechświatem ...
Edytuj: te dwie wartości są naprawdę nieco inne.
OK, nie muszę wszystkiego rozumieć. Chociaż nie mam do czynienia z pieniędzmi, nie będzie maksymalnie 3 miejsc po przecinku, więc „walutą” jest wyjście
BTW: Obliczenia:
DATA[i].Meta.UnUsedAmount := DATA[i].AMOUNT - ObjQuery.FieldByName('USED').AsFloat;
W tym przypadku jest to 3695 - 3.573,03
Zobacz JIRA RSP-13792. Możesz wywołać funkcję 'comparevalue'. – Magoo
@Magoo Ten raport jest fałszywy. Kompilator zachowuje się poprawnie. –
'StrToFloat' powinien zachowywać się tak, jak mówisz.Ale co z drugą wartością? Jak to jest obliczane. Myślę, że powinieneś skupić się na rzeczywistym problemie, którego nie widzimy. –