CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Problem z liczbami z przecinkiem

Problem z liczbami z przecinkiem

dział ogólny

Problem z liczbami z przecinkiem

Nowy postprzez nvdante » piątek, 4 marca 2011, 16:34

Witam

Natrafiłem na maleńki problem podczas porównywania wartości dwóch pól.
Program mnoży Edit1 * Edit2 i wypisuje wynik w Edit3 w postaci: 99000,00
Kod odpowiedzialny to:
KOD cpp:     UKRYJ  
float a, b;
        a = (Edit1->Text * Edit2->Text);
        String edit0 = FormatCurr("0.00", a);
        Edit3->Text = edit0;


Następnie porównuję wartość pola Edit4, które powstaje tak:
KOD cpp:     UKRYJ  
float c;
        c = EditX->Text - EditX->Text - EditX->Text - EditX->Text;
        String edit3 = FormatCurr("0.00", c);
        Edit4->Text = edit3;


A następnie porównuję wartości tak:
KOD cpp:     UKRYJ  
if (EditX->Text < EditX->Text)
        {
        Label10->Color = clRed;
        Label11->Color = clRed;
        }
        else
        {
        Label10->Color = clBlue;
        Label11->Color = clBlue;
        }


Problem polega na tym, że kod działa prawidłowo dla liczb o tej samej ilości znaków.
Dla przykładu: 886472,88 jest mniejsze niż 99000,00
Oczywiście jest to błąd, ale nie bardzo wiem, jak go poprawić.
Liczba znaków oczywiście zmienna :)
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z liczbami z przecinkiem

Nowy postprzez Android » piątek, 4 marca 2011, 18:15

Spróbuj użyć funkcji StrToFloat();
Zamiast zapisu :
Kod: Zaznacz cały
c = EditX->Text - EditX->Text - EditX->Text - EditX->Text;

uzyj
Kod: Zaznacz cały
c = StrToFloat(EditX->Text) - StrToFloat(EditX->Text) - StrToFloat(EditX->Text) - StrToFloat(EditX->Text);

I analogicznie w każdym miejscu gdzie zapisujesz/wykorzystujesz zawartość EditX->Text (lub inny string) jako wartość float.
W drugą stronę tak samo... jak chcesz użyć float jako string wykorzystaj funkcje FloatToStr();

Prawdopodobnie błąd sortowania generowany jest przez porównanie pierwszych znaków tak jak przy sortowaniu ciągu znakowego, a nie właściwej wartości liczbowej.
Problem leży w tej linijce - porównujesz stringi a nie liczby.
Kod: Zaznacz cały
if (EditX->Text < EditX->Text)
Avatar użytkownika
Android
Bladawiec
Bladawiec
 
Posty: 46
Dołączył(a): poniedziałek, 5 kwietnia 2010, 16:51
Podziękował : 16
Otrzymał podziękowań: 2
System operacyjny: Windows 7 Pro x64
Kompilator: C++ Builder XE2
Gadu Gadu: 0
    Windows 7Firefox

Re: Problem z liczbami z przecinkiem

Nowy postprzez nvdante » piątek, 4 marca 2011, 18:29

Zaraz sprawdzę.
Dzięki za info :)
Liberae sunt nostrae cogitationes
Avatar użytkownika
nvdante
Intelektryk
Intelektryk
 
Posty: 188
Dołączył(a): piątek, 12 czerwca 2009, 16:58
Lokalizacja: Dom
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: VS 2015
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z liczbami z przecinkiem

Nowy postprzez Cyfrowy Baron » piątek, 4 marca 2011, 18:58

Dla liczb zmiennopozycyjnych można użyć funkcji ToDouble():

KOD cpp:     UKRYJ  
c = EditX->Text.ToDouble() - EditX->Text.ToDouble() - EditX->Text.ToDouble() - EditX->Text.ToDouble();


W tym przypadku jak również w przypadku opisanym przez Android właściwość Text obiektu typy TEdit, która jest typu AnsiString (C++Builder w wersji poniżej 2009) lub UnicodeString (C++Builder w wersji 2009 lub wyższej) musi zawierać tekst będący liczbą. Jeżeli obiekt będzie zawierał łańcuch znaków nie reprezentujący liczby to program zwróci błąd. Można temu zapobiec używając funkcji StrToFloatDef. Funkcja jako pierwszy argument pobiera tekst, który ma być przekonwertowany na liczbę, a jako drugi argument liczbę będącą wartością domyślną jaką funkcja zwróci, gdy tekst nie da się skonwertować, czyli w sytuacji, gdy łańcuch znaków nie reprezentuje liczby:
KOD cpp:     UKRYJ  
c = StrToFloatDef(EditX->Text, 0) - StrToFloatDef(EditX->Text, 0) - StrToFloatDef(EditX->Text. 0) - StrToFloatDef(EditX->Text. 0);


W przypadku liczb całkowitych masz do dyspozycji funkcje ToInt(), oraz ToIntDef(int Default);

KOD cpp:     UKRYJ  
String tekst = "20";
int x = tekst.ToInt();
int y = tekst.ToIntDef(0);
int z = StrToInt(tekst);
int q = StrToIntDef(tekst, 0);
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 3 gości