Page 1 of 1

Intrebare

Posted: 01 Jun 2008, 11:50
by imnikey
De ce codul urmator nu imi da nr=2.88 ci 2.89?

double nr=0.9*3.2;
nr*=100;
nr=ceil(nr);
nr/=100;
cout<<nr<<endl;

Cum pot sa fac rotunjirea in plus a unui numar cu 2 zecimale? (Ex. rotunjire 42.4243 sa fie 42.43).
Codul e in vc++.

Re: Intrebare

Posted: 01 Jun 2008, 15:10
by Silviu Ardelean
imnikey wrote:Ex. rotunjire 42.4243 sa fie 42.43
E firesc, ca rotunjind valoarea 42.4243 vei obtine la rotunjirea cu doua zecimale 42.42. Poate nu ar strica sa te uitzi putin printr-un manual de aritmetica.
Daca in loc de 42.4243 aveai 42.4256 atunci, rotunjund la doua zecimale, aveai rezultatul dorit. Daca a 3-a zecimala e minim 5 atunci rotunjirea se face in sus si vei obtine 42.43, altfel rotunjirea se face in jos.

Re: Intrebare

Posted: 01 Jun 2008, 15:34
by Marius Bancila
Well, nu trebuie sa fie neaparat o lege a matematicii. ;) Poate sa fie de exemplu o regula din domeniul financiar.

Re: Intrebare

Posted: 02 Jun 2008, 09:59
by Dragos Cojocari
imnikey wrote:Cum pot sa fac rotunjirea in plus a unui numar cu 2 zecimale? (Ex. rotunjire 42.4243 sa fie 42.43).
Codul e in vc++.
Daca vreui sa rotunjesti in sus la intreg atunci poti face asa : x = f + 0.5 ( unde f e valoarea reala)

In general, daca vrei sa rotunjesti in sus la o anumita zecimala aduni 5^10-n unde n e indexul zecimalei dorite.

Re: Intrebare

Posted: 05 Jun 2008, 23:54
by Ovidiu Cucu
In general, in C/C++, daca vrei rotunjire corecta la a-N-a zecimala nu te bazezi nici pe float nici nici pe double.

Re: Intrebare

Posted: 06 Jun 2008, 10:25
by Dragos Cojocari
Ovidiu Cucu wrote:In general, in C/C++, daca vrei rotunjire corecta la a-N-a zecimala nu te bazezi nici pe float nici nici pe double.
Te referi la numere reprezentate ca array-uri? Eu am dat solutia in cazul in care ai numarul real intr-un tip de baza real.

Re: Intrebare

Posted: 07 Jun 2008, 15:04
by Ovidiu Cucu
N-am zis ca nu-i deloc OK.
Mi-am amintit doar de o socoata ce o facusem eu si un coleg mai demult cand lucram la o aplicatie financiara. Daca am fi bagat un mic bug care sa "fure" din fiecare tranzactie sa zicem la a patra zecimala si sa "depuna" intr-un anumit cont... Bineiteles pana la urma s-ar fi descoperit toata tarasenia dar ar fi luat intre doua si trei zile lucratoare timp suficient sa retragem o valiza cu euroi si sa disparem pe undeva printr-o insula cu clima blanda, femei frumoase si fara tratat de extradare cu EU. ;)

Ce am vrut sa spun e ca nu te poti baza pe float nici pe double cand e vorba de acuratete la zecimale. Sunt sigur ca stii si tu ca "fura" singure, din cauza reprezentarii.


// povestea de mai sus a fost o gluma; copii, nu faceti asta acasa si, va rog, nu chemati Interpolul! :biggrin:

[ later edit ]

Pentru cine vrea sa afle mai multe despre reprezentari (virgula mobila s.a.m.d.) si problemele legate de acestea, recomand cu caldura Arta programarii calculatoarelor(vol.2, Algoritmi seminumerici) a lui Knuth.