9 / 11
Feb 2021

Witam,

Problemem jest ta linijka, która przerabia float na int:

10: zl*=100; zloty=zl;

Źle zadziała na przykład dla wartości:

4.43

Pzdr.

Dzięki :smiley: nie wiem po co mi ten int był potrzebny :face_with_hand_over_mouth: tylko przeszkadzał w zdobyciu AC

15 days later

Skoro już trafiłam na to zadanie to ktoś mógłby mi powiedzieć
cin>>kwota;
ilezl=kwota;
gr=(kwota-ilezl)*100;
ilegr=gr;
działa dobrze dla jednych danych i źle dla np. 2.03 - wydaje 2 grosze. Problem rozwiązałam ale chciałabym wiedzieć dlaczego ? Pośrednie wartości poprawne i bęc…

sprawdź wartość 2.03 , przynajmniej u mnie na ideonie daje błędną odpowiedź… a i od razu wyświetl co zawiera liczba

W twoim kodzie brakuje typów danych, ale zakładam, że problem leżał w konwersji z double na int.
Liczba d=2.03, może być zapisana jako d=2.0299999999… i wtedy wynikiem operacji

int i = 100.0*d

będzie 202.

Żeby sobie z tym poradzić wystarczy zrobić tak:

int i = 100.0*d + 0.5

właśnie tak rozwiązałam problem, ale przy wyświetlaniu double nawet z większą ilością znaków było dobrze (2.0300) a przy konwersji taki numer…

Zaokrąglanie przy wyświetlaniu i rzutowanie na inta, to dwie różne sprawy.
Jak wyświetlisz printf("%.20f", d) to nadal będzie 2.03…?
Warto też podejrzeć wartość takiej zmiennej w debuggerze.

Przy wyświetlaniu wykonywane jest odpowiednie zaokrąglenie, więc wartość 2.02999 - > 2.03.

Podczas rzutowania na inta, część dziesiętna jest odcięta a całkowita trafia do inta bez żadnego zaokrąglania. Dlatego 1.999999999999999999 to wciąż 1 podczas rzutowania.

I dlatego tak trudne są zadania, gdzie wartości zmiennoprzecinkowe i całkowite przeplatają się nawzajem.

1 month later

Dokładnie tak, z tym, że w/w sposób to jest zaokrąglanie, więc można też tak:

int i = round (100 * d);

lub w tym zadaniu:

char znak; //przecinek
int zlote, grosze;
cin >> zlote >> znak >> grosze;

Zaleta, używamy zmiennych całkowitych, zamiast rzeczywistrych, ale ten sposób nie zadziała dla np takich danych:
4,5 - będzie wczytane 4 złote i 5 groszy, zamiast 50.
4, w/w program wywali się
4 w/w program wywali się