Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Redondeos y no redondeos (https://www.clubdelphi.com/foros/showthread.php?t=68402)

vivamotos 11-06-2010 10:40:46

Redondeos y no redondeos
 
Buenos días,

Tengo problemas graves con los float,

vereis si tengo el valor 7,636 almacenado en un float y lo quiero convertir a un float pero que me coga los dos primeros decimales,es decir, que quedase 7,63 SIN REDONDEAR como lo hago?????

Otra cosa, porque cuando una string tengo "7,63" y pongo StrToFloat(7,63) el valor que me devuelve es 7,63000000145!!!!

Como puedo solucionar estos casos?

mcs 11-06-2010 11:03:43

Cita:

Empezado por vivamotos (Mensaje 366965)
Buenos días,

Tengo problemas graves con los float,

vereis si tengo el valor 7,636 almacenado en un float y lo quiero convertir a un float pero que me coga los dos primeros decimales,es decir, que quedase 7,63 SIN REDONDEAR como lo hago?????

Otra cosa, porque cuando una string tengo "7,63" y pongo StrToFloat(7,63) el valor que me devuelve es 7,63000000145!!!!

Como puedo solucionar estos casos?

La solución es muy "simple": no usar float. Lo que te ocurre es normal, y el problema es que no todos los numeros decimales tienen representación en un float o en un double. El 7,63 es uno de estos números, y no hay solución posible.

Deberías buscar otro tipo de datos que no sea de coma flotante. Es más, no se debería usar NUNCA los datos de coma flotante para operaciones que necesiten precisión de x decimales, y usar tipos de datos de coma fija.

En Java pasa exactamente lo mismo, y la solución que se da siempre es no usar variables float, y usar la clase BigDecimal (que es una p*tada, porque en Java no se pueden sobrecargar los operadores, y en vez de hacer a=a+b-c se hacen cosas tan bonitas como a.add(b).subtract(c)).

jcosta 11-06-2010 11:57:35

¿Y pasándolo a String mediante FormatFloat y después haciendo un StrToFloat?

valor = 7,636
StrToFloat(FormatFloat("0.00", valor))

no recuerdo si te lo redondea.

Saludos.

coso 11-06-2010 12:07:50

Hola,
en la unidad math hay varias funciones de redondedo: Round, Ceil, Trunc, Floor, etc...cada una con matices diferentes segun lo que necesites (creo que este mismo necesitas Floor). Tambien puedes multiplicar por 100, redondear, y luego dividir por 100 otra vez, quedandote tansolo los decimales que necesitas. No se, creo que el problema es bastante solucionable si le pones un poco de empeño. En cuanto a la representacion, FormatFloat como dice jcosta o bien usar Format('%0.2f',[numero]). A ver si te sirve, saludos.

vivamotos 11-06-2010 12:08:51

FormatFloat redondea
 
FormatFloat redondea :(, en c++ builder que recomendais pues para trabajar con decimales?

escafandra 12-06-2010 00:21:20

Código:

#include <math.h >
float NDecimales(float f, int decimales)
{
  return floor(f*pow(10, decimales))/pow(10, decimales);
}

Expresar 2 decimales sin redondeo:
Código:

float F, f = 7.636;
F = NDecimales(f, 2);

Saludos.

Casimiro Notevi 12-06-2010 00:29:48

Mira también este hilo.


La franja horaria es GMT +2. Ahora son las 08:16:47.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi