2012-09-28 25 views
5

¿Cómo puedo evitar el error de redondeo en C++ o corregirlo?¿Cómo prevenir el error de redondeo en C++?

Ejemplo:

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

Se imprime 1000!

+0

Dependiendo del modo de redondeo, '1000' parece ser la respuesta correcta para mí. ;-) –

+0

Bueno, no quiero que vaya a 1000 Quiero que sea 999.9999:/ –

+0

usa doble porque 999 es demasiado grande para tener 0,9999 –

Respuesta

4

Puede modificar el redondeo realizado por cout estableciendo la precisión.

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

Como alternativa, puede utilizar printf de cstdio.

+0

Wow que realmente ayuda:) (no lo arrojará a 1000). Gracias –

3

De forma predeterminada, la salida formateada a través de std::ostream redondea los valores de coma flotante a seis cifras decimales significativas. Es necesario siete para evitar que su número se redondea a 1000:

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

Además, tenga en cuenta que usted está cerca del límite de la precisión de float, asumiendo la representación IEEE de 32 bits de uso común. Si necesita más de siete cifras significativas, deberá cambiar al double. Por ejemplo, las siguientes impresiones 1000, no importa la cantidad de precisión se especifica:

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

Como se mencionó anteriormente, si está buscando sólo para cout redondeo solución, utilice la función .precision. Si se refiere a la incapacidad de los puntos flotantes para representar todas las fracciones posibles, lea a continuación:

No puede evitar tales errores de redondeo utilizando números de coma flotante. Debe representar sus datos de una manera diferente. Por ejemplo, si quiere 5 dígitos de precisión, simplemente guárdelo como un largo que represente el número de sus unidades más pequeñas.

I.e. 5.23524 w/precision at 0.00001 se puede representar en un largo (o int si su rango de valores se ajusta) como 523524. Usted sabe que las unidades son 0.00001 por lo que puede hacer que funcione.

1

Para evitar que su salida sea redondeada, utilice setprecision en 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; 

El valor real almacenado en someNumber siempre será 999.9999 sin embargo, por lo que no necesita preocuparse por el valor en sí mismo (a menos que necesite más precisión que proporciona flotación).

Cuestiones relacionadas