Redondeo
Hola amigos del foro, Tengo problemas para redondear una cifra con tres decimales a 2, en este caso especifico es el número
21,465 q debería darme 21,47 al redondearlo, pero me da como resultado el 21,46. A ver si me dan una ayuda. Gracias anticipadamente Cesar |
Prueba con esta función que cree en su momento para el Euro.
Código:
|
Marcos, agradesco tu respuesta que fue la indicada para resolver el problema.
saludos |
¿No es más fácil así?
Código:
var |
Hola Roman:
Sabes si funciona con todas las versiones de Delphi, estoy en Francia y no puedo hacer comprobaciones |
Es a partir de Delphi 6.
Saludos! |
es muy simple el redondeo solo debes incluir en la seccion uses la libreria math y utilizar la funcion SimpleRoundTo().
Esta funcion te permite redonder un numero de la siguiente forma: SimpleRoundTo(1234567, 3) 1234000 SimpleRoundTo(1.234, -2) 1.23 SimpleRoundTo(1.235, -2) 1.24 SimpleRoundTo(-1.235, -2) -1.23 ej: Código Delphi [-]var a,b,c:real begin a:=strtofloat(edit1.text); b:=strtofloat(edit2.text); c:=a/b; edit3.text:=floattostr(SimpleRoundTo(c,-2)); este codigo lo que hace es que hacer una division de dos numeros reales y formatea la salida para que el resultado de la division solo tenga dos cifras decimales ej: 53/3=17,6666666666667; pero con simpleroundto: 53/3=17.67 |
|
Siguiendo este post que tiene muchos años ya sin embargo me esta pasando algo curioso respecto al redondeo con la función
En este caso como verán ese centavo me está causando diferencia en el desarrollo que estoy realizando mucha diferencia a la hora de los reportes de ventas. Alguna mejor idea de funciones que me retorne valores deseados reales... espero alguna gran ayuda... Saludos novato_erick |
¿Y cual es el problema?
|
Hola novato_erick.
A mi tampoco me queda claro si lo que esperas es 11.99 y obtenes 12 o viceversa. El método común de redondeo consiste en verificar el valor del próximo dígito a la derecha del que se quiere redondear. Si este es menor a 5, el dígito a redondear no se altera, caso contrario se incrementa su valor en uno. Si el valor a redondear a dos cifras es 11.99, entonces: dejará en la variable "Resultado" el valor 11.99, para hacerlo mas claro agreguemos un cero a la derecha: 11.990. Como queremos redondear a dos cifras, revisamos el valor de la tercera (0), es menor que cinco y por tanto no se tiene que alterar el valor de la segunda. Para lograr el resultado 12 a partir de 11.99 habría que hacer:
Si estas obteniendo otro comportamiento, sinceramente no sé que puede estar pasando... Saludos :) |
Hola ecfisa y casimiro gracias ppr responder... en realidad ecfisa tine razon. El problema no esta en las funciones de redondeo si no en el mismo campo en la base de datos de firebird q almacena el dato como un float hasta con N cantidad de decimales q en ocasiones en el tercer decimal hay un numero mayor de 5 haciendo dificil o creo imposible q no me redondee... tendre q cambiar el campo en la bd a Decimal 12,2..
.... Agradeciendo siempre su aporte Novato_erick |
Cita:
|
|
Cita:
Cita:
el asunto como lo mencioné antes la db tiene el campo de tipo Float el cual todo numero que ingrese me manda hasta doce decimales. la solución creo que estaría en cambiar el tipo de dato a Decimal 12, 2 como lo puse en el post anterior sin embargo me acabo de encontrar que no es compatible Decimal con float En firebird aunque tambien se que no es exclusivo de firebird la incopatibilidad de datos ya ingresado para codificar el campo; nuevamente Gracias Chicos... Es bueno saber que no estoy solo en esto.... Saludos |
Cita:
Como te comentó Casimiro es el comportamiento natural de todos los sistemas (al menos los que conozco). Saludos :) |
novato_erick,
Cita:
El código anterior permite hacer diferentes tipos de ajustes decimales con redondeo y sin redondeo. Espero sea útil :) Nelson. |
Si quieres redondear, por ejemplo, a 2 decimales:
|
Hola novato_erik.
Tanto Delphi como Firebird, redondean (y lo hacen muy bién) con SimpleRoundTo() y ROUND(), pero si sos de los que te gusta ir a las bases, te pongo otra opcion. Delphi:
Firebird:
Saludos :) |
Hola chicos definitivamente cambié en la base de datos en firebird el tipo de campo a decimal 12,2 corrigió muchos de mis problemas pero como dije muchos de mis problemas quedando algunos al azar en la aplicación con el asunto de los redondeos.
nuestro amigo ecfisa me dice: Cita:
Cita:
en fin necesito esto porque en mi país están utilizando las dichosas impresoras fiscales el cual ese valor de 5.265 ella misma me hace el calculo y lo guarda como 5.27 mientras que en la aplicación simpre me está mostrando el 5.26 aun utilizando la función Simpleroundto. Saludos |
Pues usa la función que he puesto yo antes.
Y veo que ecfisa también. Creo que con ellas no tendrás ese problema. |
En realidad, las funciones de redondeo nativas de Delphi no fueron de todo buenas en las versiones de años anteriores. En Delphi 7, por ejemplo, es evidente un bug de signo en la función SimpleRoundTo.
Delphi 7: Delphi XE2: Viendo el código fuente de la unidad Math, noto que Embarcadero ha insertado diversos cambios relacionados con las funciones de redondeo, y las pruebas arrojan mejores resultados que en Delphi 7. Por otra parte, parece que SetRoundMode ya no tiene efecto sobre RoundTo, lo cual puede ser bueno o malo, dependiendo de si utilizábamos o no esta última para hacer operaciones de ceil y floor (como las ilustradas por Nelson en el mensaje 17). novato_erick no deberá tener más problemas si usa una versión reciente de Delphi. Pero cabe recordarle que hay muchas funciones hechas por la Comunidad (como las que ya le sugirieron) que puede emplear de manera igualmente efectiva en versiones de Delphi como la 7. Tal vez el siguiente código ayude a apreciar lo que comento en los párrafos anteriores. Para quien pueda hacerlo, recomiendo probarlo tanto en Delphi 7 como en XE2, pues con ello notará las diferencias. Incluyo en estas pruebas unas con ghRound (función de GHF) a fin de ofrecerle una alternativa más a nuestro compañero. Finalmente, creo que vale la pena echar un vistazo a este par de antiguos hilos (tan antiguos como el proceso de pulimento de mi carácter :o): http://www.clubdelphi.com/foros/show...573#post170573 http://www.clubdelphi.com/foros/showthread.php?t=38102 Un saludo. Al González. |
Cita:
|
hola Al González cómo siempre tus aportes igual que el de tus colegas casimiro, ecfisa son un ejemplo de conocimiento y enriquecimiento en este foro los felicito y les doy las gracias..
Al González Cita:
Algo curioso casimiro utilicé tu función que me recomendabas y la de ecfisa también pero tengo el mismo problema no me redondean cuando el tercer valor decimal ejemplo: 5.265 u otro valores. por eso busqué la ayuda de delphi y otros hilos es extraño que no suceda muy a menudo. ya me está volviendo loco ese redonde porque la imp fiscal si lo hace siempre para arriba y en cosasiones es 0.01 centécimos el valor que me hace falta en la factura... Saludos chicos pd: disculpen si no he mencionado a las otras personas que me han siempre colaborado pero son varios que olvido sus nick... pero igual manera son muy útiles sus aportes gracias chicos |
Pon un ejemplo concreto, con código, datos, valores, todo.
¡Y a saber cómo redondea esa impresora! |
Cita:
A ver... proba de este modo:
Ejemplo:
Saludos :) |
Hola Chicos lastimosamente la impresora fiscal tiene una dll llamada BEMAFI32.dll el cual llama una funciones en el que están dentro de una unidad que la llame declaraciones y busque cómo la impresora realiza el redondeo y solamente tiene esto:
más nada jejeje igual que otras funciones que utilizo. en cuanto a código de ejemplo hago lo siguiente:
Saludos novato_erick |
1 Archivos Adjunto(s)
Hola una imagen para que vean pueda ser más ilustrado eso es en el caso de una variable que maneja los descuentos pero lo mismo sucede en otras variables con el redondeo.
Saludos novato_erick |
novato_erick,
Cita:
El código anterior redondea un número tipo double al número de decimales especificados con redondeo al infinito, como se muestra en la siguiente imagen: Espero sea útil :) Nelson. |
hola eficsa utilice la funcion redondeo
implementaré la función en todos los procedimientos que necesito redondear a dos decimales despues que hago el cálculo de descuentos e impuestos creo que doy por solucionado este tema del redondeo pero que extraño que las funciones estandar que tiene delphi no realice bien esto. Pero claro todo tiene sus ventajas ya que no hay que atenerse a lo creado si no hay que crear... Gracias Chicos en realidad muchas gracias por todo... Saludos novato_eric |
Yupiiiiiiiiiiiiiiiiiiiii Chicos listo utilicé la función en todas las variables que necesitaba y ahora si me cuadra con la impresora Fiscal y el sistema...
Chicos Agradecidos enormeeeeeeeeeeeementeeeeeeeeee por su ayuda.... Un Gran Saludos Gracias.... |
La franja horaria es GMT +2. Ahora son las 00:41:53. |
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