2012-09-28 11 views
5

Come posso evitare errori di arrotondamento in C++ o risolverlo?Come prevenire l'errore di arrotondamento in C++?

Esempio:

float SomeNumber = 999.9999; 
cout << SomeNumber << endl; 

esso stampa 1000!

+0

A seconda della modalità di arrotondamento, '1000' sembra la risposta corretta per me. ;-) –

+0

beh non voglio che vada a 1000 Voglio che sia 999.9999:/ –

+0

uso doppio perché 999 è troppo grande per avere un 0.9999 –

risposta

4

È possibile modificare l'arrotondamento eseguito da cout impostando la precisione.

cout.precision(7); 
float SomeNumber = 999.9999; 
cout << SomeNumber << endl; 

In alternativa, è possibile utilizzare printf da cstdio.

+0

Wow che aiuta davvero:) (non lo getterà a 1000). Grazie –

3

Per impostazione predefinita, l'output formattato tramite std::ostream arrotonda i valori in virgola mobile a sei cifre decimali significative. È necessario sette per evitare il proprio numero sia arrotondato a 1000:

cout << setprecision(7) << SomeNumber << endl; 
     ^^^^^^^^^^^^^^^ 

Inoltre, essere consapevoli del fatto che sei vicino al limite della precisione di float, assumendo la comunemente usato rappresentazione IEEE a 32 bit. Se hai bisogno di più di sette cifre significative, dovrai passare a double. Ad esempio, i seguenti stampe 1000, non importa quanto la precisione si specifica:

float SomeNumber = 999.99999; // 8 significant figures 
cout << setprecision(10) << SomeNumber << endl; 
0

Come accennato in precedenza, se siete alla ricerca solo per cout arrotondamento correzione, utilizzare la funzione .precision. Se ti riferisci all'incapacità dei punti fluttuanti di rappresentare tutte le possibili frazioni, leggi di seguito:

Non è possibile evitare errori di arrotondamento utilizzando numeri in virgola mobile. Devi rappresentare i tuoi dati in un modo diverso. Ad esempio, se desideri 5 cifre di precisione, memorizzalo come un lungo che rappresenta il numero delle unità più piccole.

I.e. 5.23524 w/precisione a 0.00001 possono essere rappresentati in un valore long (o int se il tuo intervallo di valori si adatta) come 523524. Sai che le unità sono 0.00001 in modo che tu possa facilmente farlo funzionare.

1

Per evitare che l'emissione venga arrotondata, utilizzare setprecision in iomanip.

float SomeNumber = 999.9999; 
std::cout << SomeNumber << std::endl; //outputs 1000 
std::cout << std::setprecision (7) << SomeNumber << std::endl; //outputs 999.9999 
return 0; 

Il valore effettivo memorizzato nel someNumber sarà sempre 999,9999 però, quindi non c'è bisogno di preoccuparsi per il valore stesso (a meno che non avete bisogno di più precisione rispetto float fornisce).