Para de impresión un valor redondeado, @Matt J bien responde a la pregunta.
float x = 45.592346543;
printf("%0.1f\n", x); // 45.6
Como la mayoría del punto (FP) flotante es binaria basada, exacta de redondear a un decimal lugar no es posible cuando la respuesta es matemáticamente correcto x.1, x.2, ...
.
Para convertir el número FP en más cercano0.1
es otro asunto.
Desbordamiento: Enfoques que la primera escala por 10 (o 100, 1000, etc.) pueden desbordarse para la gran x
.
float round_tenth1(float x) {
x = x * 10.0f;
...
}
doble redondeo: Adición 0.5f y luego usando floorf(x*10.0f + 0.5f)/10.0
devuelve el resultado incorrecto cuando la suma intermedia x*10.0f + 0.5f
rondas hasta un nuevo entero.
// Fails to round 838860.4375 correctly, comes up with 838860.5
// 0.4499999880790710449 fails as it rounds to 0.5
float round_tenth2(float x) {
if (x < 0.0) {
return ceilf(x*10.0f + 0.5f)/10.0f;
}
return floorf(x*10.0f + 0.5f)/10.0f;
}
casting a int
tiene el problema obvio cuando float x
es mucho mayor que INT_MAX
.
Usando roundf()
y la familia, disponible en <math.h>
es el mejor enfoque.
float round_tenthA(float x) {
double x10 = 10.0 * x;
return (float) (round(x10)/10.0);
}
Para evitar el uso de double
, sólo tiene que comprobar si el número debe redondeo.
float round_tenthB(float x) {
const float limit = 1.0/FLT_EPSILON;
if (fabsf(x) < limit) {
return roundf(x*10.0f)/10.0f;
}
return x;
}
El redondeo parece funcionar bien, pero por ejemplo redondeando 45.569346543; es 45.599998 .... o 45.5 con * 1.0f ... Estoy más cerca de pensar, necesito leer el piso y el cielo nuevamente. gracias chicos. –
Viene de imprecisión en coma flotante, cambié al doble, funciona muy bien. Gracias. –
Solo para reiterar el comentario de cierre de Matt J, que no estoy seguro que hayas absorbido: 45.6 no se puede representar exactamente en CUALQUIER formato de punto flotante binario, por lo que no es lo que se está almacenando, incluso cuando utilizas el doble. Si su programa ahora está imprimiendo "45.6" es porque las rutinas de salida lo están redondeando. – Spike0xff