FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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. |
#2
|
|||
|
|||
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 |
#3
|
|||
|
|||
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. |
#4
|
||||
|
||||
#5
|
|||
|
|||
Gracias Marcoszorrilla, ya había estudiado ese tema, pero no resolvía mi problema ni mis dudas.
Saludooooooooooooos.
__________________
Rafita. |
#6
|
||||
|
||||
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 |
|
|
|