Intrebare

Intrebari despre programarea cu VC++ incluzand mediul de dezvoltare, instalare, setari, debugger, compilator, linker si documentatie.
Post Reply
imnikey
Junior
Junior
Posts: 1
Joined: 01 Jun 2008, 11:48

Intrebare

Post by imnikey » 01 Jun 2008, 11:50

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++.



User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: Intrebare

Post by Silviu Ardelean » 01 Jun 2008, 15:10

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.
Last edited by Silviu Ardelean on 01 Jun 2008, 20:23, edited 1 time in total.

User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: Intrebare

Post by Marius Bancila » 01 Jun 2008, 15:34

Well, nu trebuie sa fie neaparat o lege a matematicii. ;) Poate sa fie de exemplu o regula din domeniul financiar.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

Dragos Cojocari
Membru++
Membru++
Posts: 789
Joined: 11 Jul 2007, 14:11

Re: Intrebare

Post by Dragos Cojocari » 02 Jun 2008, 09:59

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.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Intrebare

Post by Ovidiu Cucu » 05 Jun 2008, 23:54

In general, in C/C++, daca vrei rotunjire corecta la a-N-a zecimala nu te bazezi nici pe float nici nici pe double.

Dragos Cojocari
Membru++
Membru++
Posts: 789
Joined: 11 Jul 2007, 14:11

Re: Intrebare

Post by Dragos Cojocari » 06 Jun 2008, 10:25

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.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Intrebare

Post by Ovidiu Cucu » 07 Jun 2008, 15:04

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.

Post Reply