Saltar al contenido

Truncar un valor decimal en C++

Este equipo de expertos despúes de muchos días de trabajo y de recopilar de datos, obtuvieron la respuesta, nuestro deseo es que te sea útil en tu trabajo.

Solución:

una buena referencia para por qué esto sucede se puede encontrar en Lo que todo científico informático debe saber sobre la aritmética de punto flotante por David Goldberg.

Primero, es importante saber que los números de punto flotante son aproximados. Consulte el enlace proporcionado por @Greg Hewgill para comprender por qué este problema no se puede resolver por completo.

Pero aquí hay un par de soluciones al problema que probablemente satisfagan sus necesidades:

Probablemente el mejor método pero menos eficiente:

char sz[64];
double lf = 0.600000002;
sprintf(sz, "%.4lfn", lf); //sz contains 0.6000

double lf2 = atof(sz);

//lf == 0.600000002;
//lf2 == 0.6000

printf("%.4lf", lf2); //print 0.6000

La forma más eficiente, pero probablemente menos precisa:

double lf = 0.600000002;
int iSigned = lf > 0? 1: -1;
unsigned int uiTemp = (lf*pow(10, 4)) * iSigned; //Note I'm using unsigned int so that I can increase the precision of the truncate
lf = (((double)uiTemp)/pow(10,4) * iSigned);

Siendo realistas eso no es posible. No es una limitación de C++, sino la forma en que funciona el punto flotante. Para muchos valores no hay representaciones precisas, por lo que no puede simplemente truncar a una cantidad de dígitos.

Puede truncar al imprimir usando cadenas de formato printf.

Si realmente necesita poder almacenar solo una cantidad limitada de dígitos, le sugiero que use un tipo de datos de precisión fija en su lugar.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *