ALGO25 / BLOG

De ce 5/2 dă 2 în C++ și când convertești la double

Înțelege diferența dintre împărțirea întreagă și cea reală. Vezi de ce atribuirea la double nu repară calculul și verifică ordinea conversiei.

Expresia 5/2 produce 2 deoarece ambii operanzi sunt întregi. Dacă atribui acest rezultat unei variabile double, obții 2.0, nu 2.5. Tipul destinației nu se întoarce în timp ca să schimbe operația deja efectuată.

Conversia trebuie să ajungă la un operand

Pentru un rezultat real, cel puțin un operand al împărțirii trebuie să fie real. 5.0/2, 5/2.0 și static_cast<double>(5)/2 produc 2.5. În schimb, static_cast<double>(5/2) convertește rezultatul întreg 2 în 2.0. Parantezele stabilesc ce anume convertești.

static_cast<double>(a) este o conversie explicită: ceri o valoare de tip double pornind de la a. Nu modifică variabila a. În expresia mediei a două numere, trebuie verificată și suma dinaintea împărțirii. Forma (a+b)/2.0 poate calcula mai întâi a+b în tipul întreg; static_cast<double>(a)+b mută acea adunare în calcul real.

Media cere și un numitor valid

Dacă ai suma s a n valori, media este s/n numai când n este pozitiv. Pentru n=0, nu există o medie aritmetică a datelor respective. Nu ascunde cazul prin înlocuirea automată a lui n cu 1: astfel schimbi sensul problemei.

Pentru valorile 2 și 3, suma este 5 și media 2.5. Pentru 2 și 4, media este 3. Un test care produce o medie întreagă nu poate descoperi împărțirea greșită. Alege intenționat și o sumă care nu se împarte exact la numărul termenilor.

Expresia 5/2 împarte două valori întregi și produce 2. Conversia rezultatului dă 2.0; conversia unui operand înainte de împărțire permite rezultatul 2.5.Expresia 5/2 împarte două valori întregi și produce 2. Conversia rezultatului dă 2.0; conversia unui operand înainte de împărțire permite rezultatul 2.5.Mărește schema ↗

Afișarea nu schimbă valoarea calculată

Setarea unui număr de zecimale controlează textul afișat. Ea nu recuperează partea fracționară pierdută printr-o împărțire întreagă. Dacă programul a calculat 2, afișarea cu două zecimale va produce 2.00. Verifică întâi expresia, apoi formatul cerut de enunț.

Pe de altă parte, nici folosirea lui double peste tot nu este o soluție universală. Pentru numărarea obiectelor, indici sau verificarea divizibilității, calculele întregi exprimă exact cerința. Alege reprezentarea după rezultat: cât întreg, rest sau valoare reală.

Un test de autoevaluare

Prezice separat rezultatele pentru 7/2, 7/2.0 și static_cast<double>(7/2): sunt 3, 3.5 și 3.0. Explică ordinea operațiilor, nu doar diferența dintre tipurile variabilelor din stânga atribuirii.

Recapitulează operatorii, tipurile numerice și citirea și afișarea. Regula împărțirii între întregi este descrisă în specificația C++.

Întrebări frecvente

De ce 5 împărțit la 2 dă 2 în C++?

Expresia 5 / 2 are doi operanzi întregi, deci produce câtul întreg 2. Atribuirea ulterioară într-un double nu recuperează partea fracționară pierdută.

Cum obțin rezultatul real al unei împărțiri?

Convertește cel puțin un operand înaintea operației: static_cast<double>(a) / b, cu b diferit de zero. Conversia expresiei a / b după împărțire păstrează rezultatul deja trunchiat.

Setarea numărului de zecimale repară o medie calculată greșit?

Nu. Formatarea controlează numai afișarea. Dacă împărțirea întreagă a produs 2, afișarea cu două zecimale va produce 2.00, nu 2.50. Verifică tipurile operanzilor și numitorul înaintea formatului.