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 01-08-2003
rafita rafita is offline
Miembro
 
Registrado: ago 2003
Ubicación: Cuenca- España.
Posts: 309
Poder: 21
rafita Va por buen camino
Problemas matemáticos simples.

Muy buenas, necesito ayuda para solucionar un pequeño problema matemático.

Debo pasar unos números con decimales a una cadena, alineado a la derecha, sin coma ni punto decimal y cambiado los espacios por ceros.

La rutina es algo así:

var i : integer;
cadena : string[10];

...

Str(Trunc(QueryCampo.AsFloat * 100):10, cadena);
for i:=1 to 10 do
if cadena[i]=' ' then cadena[i]='0';

Si en lugar de un campo de una consulta (por cierto definido en Interbase como Numeric (10,2) ) utilizo una variable de tipo Double funciona correctamente, pero con el campo de la consulta me hace cosas raras como convertir el número 54.90 en 0000005489 (la función Trunc le hace un redondeo).

¿Cómo puedo solucionar esto?

He probado a cargar el campo de la consulta en una variable de tipo Double, pero en ese caso tampoco me funciona, lo cual me hace suponer que el problema lo tengo al referirme al campo como AsFloat, pero en otros formularios eso me funciona perfectamente.

Haciendo pruebas para solucionar lo anterior, me he encontrado con lo siguiente:


var i, j : integer;
cadena : string[10];
ndecimal : Double;
...

ndecimal:=123.00;
for j:=1 to 99 do
begin
Str(Trunc(ndecimal * 100):10, cadena);
for i:=1 to 10 do
if cadena[i]=' ' then cadena[i]='0';
Memo1.Lines.Add(cadena);
ndecimal:=ndecimal + 0.01;
end;

funcionaba correctamente hasta generar el número 123.55, pero después generaba los siguientes 123.5599, 123.5699, etc.

Hice varias modificaciones y pruebas sin conseguir solucionarlo, pero al día siguiente funcionó correctamente.

¿Qué estaba pasando?
¿Hay alguna directiva del compilador que deba utilizar?
¿Qué garantía tengo de que esto no me ocurrirá en una aplicación buena con datos y cálculos reales?
__________________
Rafita.
Responder Con Cita
  #2  
Antiguo 01-08-2003
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 25
__cadetill Va por buen camino
para numeros con solo 2 decimales, te aconsejo utilizar el tipo Currency (y si te refieres a un campo de una tabla AsCurrency). A mi me ha quitado de verdaderos dolores de cabeza con los decimales

Pruebalo y nos comentas
Responder Con Cita
  #3  
Antiguo 05-08-2003
rafita rafita is offline
Miembro
 
Registrado: ago 2003
Ubicación: Cuenca- España.
Posts: 309
Poder: 21
rafita Va por buen camino
Gracias compañero por tu respuesta, aunque debo decirte que el utilizar AsCurrency en vez de AsFloat ya lo había intentado, y no funcionó.

Haciendo más pruebas encontre que el problema venía de la función Trunc, así que la he sustituido por un Round.

Esta solución no me convence nada, puesto que un Trunc no debería modificarme los datos con los que trabajo (puesto que ya garantizo que son enteros). Así que para rematar la jugada he duplicado la función, primero utilizo el Trunc y luego el Round y comparo los resultados en busca de posibles problemas.

Con respecto a los otros resultados matemáticos inexperados, ¿alguien puede concretar algo?

Saludos.
__________________
Rafita.
Responder Con Cita
  #4  
Antiguo 05-08-2003
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Tambien puedes mirar este hilo;

http://www.clubdelphi.com/foros/show...&threadid=2643

un saludo
Responder Con Cita
  #5  
Antiguo 05-08-2003
rafita rafita is offline
Miembro
 
Registrado: ago 2003
Ubicación: Cuenca- España.
Posts: 309
Poder: 21
rafita Va por buen camino
Gracias Marcoszorrilla, ya había estudiado ese tema, pero no resolvía mi problema ni mis dudas.

Saludooooooooooooos.
__________________
Rafita.
Responder Con Cita
  #6  
Antiguo 07-08-2003
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Mirate la ayuda sobre Trunc y Round, y veras que hacen un redondeo estadistico, por lo que como ves no obtienes los resultados esperados, de ahi que te citara ese hilo porque esa funcion la diseñe precisamente para el euro,

Un Saludo
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


La franja horaria es GMT +2. Ahora son las 22:15:32.


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