Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-06-2010
vivamotos vivamotos is offline
Miembro
 
Registrado: ago 2006
Posts: 150
Poder: 18
vivamotos Va por buen camino
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?
Responder Con Cita
  #2  
Antiguo 11-06-2010
mcs mcs is offline
Miembro
 
Registrado: may 2007
Ubicación: Girona
Posts: 229
Poder: 18
mcs Va por buen camino
Cita:
Empezado por vivamotos Ver Mensaje
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)).
Responder Con Cita
  #3  
Antiguo 11-06-2010
jcosta jcosta is offline
Registrado
 
Registrado: feb 2008
Posts: 9
Poder: 0
jcosta Va por buen camino
¿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.
Responder Con Cita
  #4  
Antiguo 11-06-2010
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
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.

Última edición por coso fecha: 11-06-2010 a las 12:11:13.
Responder Con Cita
  #5  
Antiguo 11-06-2010
vivamotos vivamotos is offline
Miembro
 
Registrado: ago 2006
Posts: 150
Poder: 18
vivamotos Va por buen camino
FormatFloat redondea

FormatFloat redondea , en c++ builder que recomendais pues para trabajar con decimales?
Responder Con Cita
  #6  
Antiguo 12-06-2010
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.
Responder Con Cita
  #7  
Antiguo 12-06-2010
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Mira también este hilo.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problema con redondeos en campos Money river_1 SQL 3 16-06-2010 01:59:34
Redondeos extraños en Delphi con Currency y Firebird 2.0 Meinard Firebird e Interbase 6 07-03-2007 21:36:30
Redondeos con Firebird 2.0 Jose_T Firebird e Interbase 12 19-01-2007 19:57:02
problemas con float y redondeos wonder boy Firebird e Interbase 17 27-12-2005 20:59:06
Problemas con Redondeos AGAG4 Varios 4 14-11-2005 23:38:44


La franja horaria es GMT +2. Ahora son las 16:56:30.


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
Copyright 1996-2007 Club Delphi