C/Visual C - ¿bug de conversión double/CString VC++?

 
Vista:

¿bug de conversión double/CString VC++?

Publicado por Iñigo (7 intervenciones) el 11/10/2001 19:00:16
Hola
tengo problemas al convertir reales a strings con Vc++ y MFC
me gustaria que probaseis el siguiente código y me indicaseis si os da lo mismo.

CString aux;
aux.Format(_T( "%.20f" ), (double) 0.6 );

aux toma un valor de 0.59999999.....
en lugar de 0.60000000...

a partir de 17 decimales en adelante me pasa esto.

¿como se puede redondear a partir de un decimal?
por ejemplo
si el número es 0.000000000000000006
me lo redondee a 0.00000000000000001

agradecidamente,
Iñigo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Problemas de conversión de `double` a `CString` en VC++

Publicado por Alejandro (913 intervenciones) el 16/10/2024 22:31:30
Íñigo, el comportamiento que estás observando se debe a la forma en que los números de punto flotante son representados en la memoria. Los números en formato `double` no pueden representar todos los valores decimales exactamente, lo que puede llevar a resultados inesperados al formatear.

Para redondear un número a un número específico de decimales antes de convertirlo a `CString`, puedes usar la siguiente función:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <afx.h> // Para CString
#include <cmath> // Para round
 
CString RoundToString(double value, int decimals) {
    double factor = pow(10.0, decimals);
    value = round(value * factor) / factor; // Redondear
    CString aux;
    aux.Format(_T("%.20f"), value); // Formatear a 20 decimales
    return aux;
}
 
int main() {
    double number = 0.6;
    CString result = RoundToString(number, 20);
    // Muestra el resultado
    AfxMessageBox(result);
    return 0;
}

Explicación del código



1. `round`: Esta función redondea el número al entero más cercano. Multiplicamos el número por `10^decimals` para mover el punto decimal a la derecha, redondeamos y luego dividimos de nuevo para moverlo a la izquierda.

2. `CString`: Usamos `CString` para almacenar el resultado formateado.

3. `Format`: Formateamos el número redondeado a 20 decimales.

Redondeo de números pequeños



Para redondear números muy pequeños, como `0.000000000000000006`, puedes usar la misma función. Simplemente pasa el número y el número de decimales que deseas.

Resultado



Con este enfoque, deberías obtener el resultado esperado sin los problemas de precisión que mencionaste.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar