Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-11-2008
agustibaldo agustibaldo is offline
Miembro
 
Registrado: nov 2006
Posts: 105
Poder: 18
agustibaldo Va por buen camino
Problema de Redondeo de Decimales con una Función

Estimados amigos de Club Delphi, en esta oportunidad les escribo porque tengo un problema bastante raro con una función que intenta obtener solo dos decimales de un valor.

Concretamente tengo lo siguiente:

Código:
function TFormPrincipal.TruncarDecimales (parametro: Double):Double;
begin
  Result := (Int(parametro * 100)) / 100;
end;
la cual llamo y grabo el resultado en una variable de la siguiente manera:

Código:
IMPORTE_TOTAL := TruncarDecimales(IMPORTE);
donde IMPORTE_TOTAL e IMPORTE son de tipo Doubles.

El problema se presenta cuando graba el resultado. Supongamos que, al momento de llamar a la función, IMPORTE = 190.950; cuando graba en IMPORTE_TOTAL el resultado es 190.94.-

Realmente no se que puede estar pasando. He probado declarar tanto la function como las variables como tipo Extended pero sigue persistiendo el problema.

Desde ya muchas gracias por su tiempo.
Saludos a todos.
Responder Con Cita
  #2  
Antiguo 07-11-2008
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Thumbs up

hola agustibaldo, yo lo veo raro lo que estas haciendo en tu funcion TruncateDecimales;sinceramente no hace nada esa funcion por que primero lo multiplicas * 100 y luego lo divides por el mismo 100 . no surte ningun efecto con lo que esta entrando, osea lo mismo que entra esta saliendo.......No se realmente lo que quieres hacer con esa funcion......
Saludos.........
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7

Última edición por rgstuamigo fecha: 07-11-2008 a las 21:31:05.
Responder Con Cita
  #3  
Antiguo 07-11-2008
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 24
ContraVeneno Va por buen camino
Es broma ¿no?

multiplicas por 100 y luego divides por 100....
además, ¿que tiene de malo la función "int"?
¿para que crear otra?
__________________


Última edición por ContraVeneno fecha: 07-11-2008 a las 22:54:29.
Responder Con Cita
  #4  
Antiguo 07-11-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Que sí, que la función está bien.

multiplica por 100
coge la parte entera !!
divide entre 100

(la primera vez que ví la función, también me pasé por alto el "int" y los paréntesis )

El segundo paso se os coló , que precisamente es la que elimina los posibles decimales que tenga. Así solo se queda con 2 decimales.

Yo declaraba todas las variables como Currency y así evitaba esa función y el fallo inherente a los Floats/Extended que nunca guardarán el valor que representa, siempre guardará una aproximación.

Si usas Bases de datos, cambia el tipo también a Currency o NUMERIC(10,2) (en interbase y firebird con dialecto 3).

Si eso, pregunta .

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 07-11-2008
Avatar de ContraVeneno
ContraVeneno ContraVeneno is offline
Miembro
 
Registrado: may 2005
Ubicación: Torreón, México
Posts: 4.738
Poder: 24
ContraVeneno Va por buen camino
cierto, cierto, mea culpa

En SQL Server, el tipo de dato para el campo es "money" o "decimal(10,2)"

¿"FormatFloat" hubiera servido?
__________________

Responder Con Cita
  #6  
Antiguo 08-11-2008
[coso] coso is offline
Miembro Premium
 
Registrado: may 2008
Ubicación: Girona
Posts: 1.678
Poder: 0
coso Va por buen camino
Hola, si usas Round

Código Delphi [-]
function TForm1.TruncarDecimales (parametro: Double): Double;
begin
  Result := (Round(parametro * 100)) / 100;
end;

solucionado
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
problemas con redondeo (decimales) Milperrimo Varios 4 26-01-2008 05:33:03
Redondeo de decimales Cheswar Varios 3 07-10-2007 21:31:10
redondeo a 2 decimales torito Varios 4 22-12-2004 18:36:34
funcion de redondeo de decimales Rabata Varios 2 29-09-2003 02:41:39
Problema de redondeo cmgenny Varios 3 08-08-2003 20:16:38


La franja horaria es GMT +2. Ahora son las 16:28:35.


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