Newsgroup: it.comp.lang.c++
Titolo: Metodo Round

Ciao a tutti,
Qualcuno sa dirmi se esiste un metodo per arrotondare una variabile double a
due cifre decimali?
Grazie


Non sono sicuro che quello che chiedi abbia molto senso. Esistono solo
due numeri compresi tra 0 e 1 con due cifre decimali che siano
esattamente rappresentabili in binario, ovvero 0,25 e 0,75. Cercare di
arrotondare un qualsiasi numero non intero ad un numero fissato di cifre
decimali da' nella maggior parte dei casi un risultato inesatto.
Ciao,
Nicola

 wrote in message
news:3BC31E56...@divalsim.it...


 Massimo

 ovviamente con limite ( -MAXINT/100 , MAXINT/100 )
Non basterebbe fare:
float num;
num = float(int(num*100))/100;
?
Cecco

 > ovviamente con limite ( -MAXINT/100 , MAXINT/100 )
Ah, capito. Io troncavo e basta.
Cecco

 Esiste un metodo che mi faccia tutto cio'?
Peccato che 15,99 in binario sia un numero periodico e che quindi non
sia rappresentabile in nessuno dei tipi floating point del C++. Se il
tuo scopo e' ottenere una stringa o stampare 15,99 partendo da
15,98674232145 non c'e' problema ed e' abbastanza semplice, o con le
funzioni della famiglia printf 
#include <cstdio>
double f = 15,98674232145;
std::printf("%.2lf",f);
O con gli stream
#include <iostream>
#include <iomanip>
cout << fixed() << setprecision(2) << f;
Se invece il tuo scopo e' memorizzare in una variabile di un tipo
floating point un valore arrotondato all'ennesima cifra decimale puoi
seguire le indicazioni che ti hanno dato altri, ma sappi che otterrai
quasi sempre un valore approssimato.
Ciao,
Nicola

 quasi sempre un valore approssimato.
Non sono molto bravo in aritmetica binaria; se io iniaizlizzo un float
con il numero 1,9 (che se non sbaglio in binario è "1,11(1001)") nella
rappresentazione della macchina non sarà mai esattamente 1,9 ma avrà
sempre un errore, anche se piccolo (tipo 1.89999999999), giusto? (in
effetti il discorso mi convince, ma io ho sempre bisogno di conferme).
Ciao, 
Cecco

 effetti il discorso mi convince, ma io ho sempre bisogno di conferme).
Esatto. Se trascuriamo il problema dell'esponente la parte frazionaria
di un numero e' espressa come somma di potenze negative di 2:
0.1111 = 2^(-1) + 2^(-2) + 2^(-3) + 2^(-4) = 1/2 + 1/4 + 1/8 + 1/16 =
0.9375
Tornando al problema dell'OP le sole potenze negative di due che si
possono scrivere con al massimo due cifre decimali sono:
2^(-1) = 0.5
2^(-2) = 0.25
Quindi le sole "coppie" di cifre decimali rappresentabili esattamente in
binario sono: 0.00, 0.25, 0.50, 0.75
Ciao,
Nicola

 binario sono: 0.00, 0.25, 0.50, 0.75
Questo invece non l'ho capito bene: se non sbaglio, siccome è il float
inizializzato (o arrotondato) ad avere due cifre decimali, questo verrà
comunque approssimato alla precisione della macchina, che è superiore ai
due bit (rimembro cose tipo rappresentazione reale lungo, corto, a 16
bit ecc..: c'entrano qualcosa?).
Ciao, 
Cecco

 bit ecc..: c'entrano qualcosa?).
Proviamo con qualche esempio:
Binario	Decimale
0.0	0
0.1	0.5
0.01	0.25
0.11	0.75
Per quante cifre binarie tu aggiunga a questi numeri, non otterrai mai
un altro numero che in decimale abbia esattamente due cifre decimali.
Riprendendo l'esempio dell'OP volevamo ottenere esattamente 0.89 (la
parte intera e' irrilevante).
0.89 e' compreso: 
tra 0.1 (= 0.5) 	e 1.0 (= 1.0), ovvero 
tra 0.11 (= 0.75) 	e 1.00, ovvero 
tra 0.111 (=0.875) 	e 1.000, ovvero
tra 0.1110 (=0.875) 	e 0.1111 (=0.9375)
Aggiungendo opportunamente cifre binarie ci avvicineremo a 0.89, ma
siccome non e' possibile sommare due potenze negative di due ed ottenere
un numero con meno decimali dei due numeri originali, otterremo sempre
un numero crescente di decimali.
Ciao,
Nicola

Ok, adesso ho capito tutto, grazie.
Ciao,
Cecco