Problema extraño con Redondeo

156 views
Skip to first unread message

acmc

unread,
Apr 21, 2018, 11:50:20 AM4/21/18
to Comunidad de Visual Foxpro en Español
Hola Foxeros!!

Les cuento, en mi modulo de facturación el día de ayer me marco un error al momento de mandar a timbrar una factura y el error decia diferencia en los importes, revisando encontre la diferencia, cuando se captura la factura se hace la operación de multiplicar cantidad por precio unitario para obtener el subtotal redondeado a 2 decimales y para el proceso de generación del XML creo un archivo de texto donde hago de nuevo el calculo usando ALLTRIM(STR(item_factura.Cantidad * item_factura.prec_unit,12,2)) para que el resultado sea tipo texto y resulta que en este último si me redonde bien y en el proceso de captura lo redonde mal.

El campo cantidad lo tengo numerico 11,3  y el de prec_unit lo tengo numerico 12,5

La operación en cuestion tiene los siguientes valores  Cantidad = 1629.850  y Precio_unit = 70.50000 que al multiplicarlo sin redondeo me da 114904.425000  

cuando redondeo round(cantidad*prec_unit,2) me da 114904.42

cuando utilizo el alltrim(str()) me da 114904.43

Y no encuentro el porque no lo esta redondeando, 

Despues de hacer varias pruebas encontre que si aplico el redondeo a toda la operación y dentro de esa operación redondeo cualquiera de los 2 campos en cuestión si me redondea bien, es decir, si hago lo siguiente si redondea 

round( round(cantidad,2) * prec_unit,2)    o   round( cantidad * round(prec_unit,2),2)  o  round( round(cantidad,2) * round(prec_unit,2),2)  cualquiera de estos 3 si redondea bien porque no lo se, alguien sabe porque?

Salu2!!

Esteban Micossi

unread,
Apr 21, 2018, 7:46:00 PM4/21/18
to Comunidad de Visual Foxpro en Español
Hola acmc

Al la operacion -  round( round(cantidad,2) * prec_unit,2) -  lo estas delimitando con 2 (dos) decimales.
Prueba con  - round(cantidad,3) * Precio_unit,5) -  Alli te dara como resultado 114904.42500.
Al redondear con 2 decimales y al tener al final .42500 lo aproxima al numero siguiente .43
Suerte.Saludos
Atte Esteban Micossi


Angel Perez

unread,
Apr 21, 2018, 9:46:50 PM4/21/18
to publice...@googlegroups.com
Ese es el problema.. cuando tengo .42500 no lo redondea a 43

Oscar Bonet

unread,
Apr 21, 2018, 11:13:03 PM4/21/18
to publice...@googlegroups.com
probaste con
SET DECIMAL TO 2

_________________
Oscar 

Carlos Miguel FARIAS

unread,
Apr 22, 2018, 11:35:56 AM4/22/18
to Grupo Fox
El mejor redondeo implica primero hacer todas las operaciones de multiplicación, luego las de división y recién al final el redondeo.
Saludos: Miguel

Oscar Bonet

unread,
Apr 22, 2018, 12:43:16 PM4/22/18
to publice...@googlegroups.com
totalmente de acuerdo.  Hacerlo siempre al final.

_________________
Oscar 

Angel Perez

unread,
Apr 23, 2018, 11:13:20 AM4/23/18
to publice...@googlegroups.com
Que tal Carlos, dentro de un grid tengo un campo calculado que es la múltiplicación de cantidad por precio unitario, si como dices en una operación de simple multiplicacion debería redondear bien no? y pues resulta que no, como ahí que?

GeoSys Diseño de Software

unread,
Apr 23, 2018, 1:28:22 PM4/23/18
to Comunidad de Visual Foxpro en Español
Tu problema es para convertirlo a carácter?
Puedes utilizar en vez de STR el TRANSFORM con  SET DECIMALS TO 

multiplica=1629.850*70.50000
SET DECIMALS TO 2
?ALLTRIM(TRANSFORM(multiplica, "@R 999999999999.99"))
Resultado: 114904.43

SET DECIMALS TO 5
?ALLTRIM(TRANSFORM(multiplica, "@R 999999999999.99"))
Resultado: 114904.42

Saludos
Anthony Contreras Peralta
Costa Rica.


Angel Perez

unread,
Apr 23, 2018, 5:02:04 PM4/23/18
to publice...@googlegroups.com
No mi estimado.. como dice el titulo.. Problema extraño en Redondeo!!  

Carlos Miguel FARIAS

unread,
Apr 23, 2018, 6:58:32 PM4/23/18
to Grupo Fox
Angel: Que tipo de datos estas usando para el precio y para la cantidad?
Saludos: Miguel

Angel Perez

unread,
Apr 23, 2018, 10:45:06 PM4/23/18
to publice...@googlegroups.com
Carlos..

El campo cantidad lo tengo numerico 11,3  y el de prec_unit lo tengo numerico 12,5

Gregori Arjona Toledo

unread,
Apr 24, 2018, 3:17:27 AM4/24/18
to Comunidad de Visual Foxpro en Español
Buenos dias.

Una pregunta, es necesario que el precio unitario este definido como 12,5? , creo que para valores monetario con 4 decimales son suficientes .
Si pruebas asi ,veras que els resultado del redondeo sera el correcto.

incorrecto:

a=1629.850
b=70.50000
? ROUND(a*b,2)
114904.42

---------------------
correcto:
a=1629.850
b=70.5000

? ROUND(a*b,2)
114904.43






Saludos,

Carlos Miguel FARIAS

unread,
Apr 24, 2018, 6:53:22 AM4/24/18
to Grupo Fox
Para importes conviene usar campos currency por lo menos para los importes por la sencilla razón que internamente se almacena como enteros.
Esa es la forma en que trabaja por ejemplo COBOL, todos los números se almacenan como enteros y luego el lenguaje establece cuantos dígitos son decimales.
De esa manera, los cálculos enteros son siempre sobre valores precisos.
Hay que tener en cuenta que, cuando conviertes a string (str, transform, etc.) hay implícito algún redondeo o truncado.
Una trampa que usábamos en basic que solo manejaba flotantes era agregar medio centavo (0.005) al importe y luego simplemente truncábamos con dos decimales.
En los cálculos con flotantes (que implica que el número almacena fracciones de 1) la representación binaria de la parte decimal acarrea "basura" que en cálculos sucesivos presenta los problemas que te aparecen.
Saludos: Miguel 

dirsi...@cialta.com

unread,
Apr 24, 2018, 7:57:40 AM4/24/18
to publice...@googlegroups.com

Prueba anteponiendo este SET

SET FIXED ON


Libre de virus. www.avg.com
Reply all
Reply to author
Forward
0 new messages