Dudas con el redondeo

604 views
Skip to first unread message

NeoRazorX

unread,
Feb 21, 2013, 5:50:46 PM2/21/13
to ene...@googlegroups.com
Hola,
Al revisar toda la contabilidad del ejercicio anterior he encontrado un descuadre de 9 céntimos. Revisando más a fondo me he dado cuenta de que en algunos casos FacturaScripts genera facturas con más de dos decimales, y por tanto lo mismo en los asientos. He modificado el código para que redondee en estos casos, pero al volver a revisar todo me he encontrado con unos pocos casos dónde se producen descuadres de 1 céntimo. Al crear la misma factura con eneboo he visto que redondea de forma distinta, así que la pregunta es esta:

¿Cómo redondea los importes de las facturas eneboo?

José Antonio Fernández Fernández

unread,
Feb 22, 2013, 2:05:07 AM2/22/13
to ene...@googlegroups.com

Yo he visto q usa 2 funciones : roundfieldvalue que saca media entre un valor dado y otro almacenado en bd. Y por otro lado math.round(100*valor)/100. Pero esto a ve es da por ejemplo 100.100000000001. ??.salu2

--
Has recibido este mensaje porque estás suscrito al grupo "Eneboo" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a eneboo+un...@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.
 
 

José Antonio Fernández Fernández

unread,
Feb 22, 2013, 2:08:14 AM2/22/13
to ene...@googlegroups.com

Para comprobar los ivas ,comprueba el iva de la factura calculado del neto y lo contrasta con la suma del neto de todas las lineas de factura y su nuevo calculo de iva. Despues aplica la media de los dos valores.salu2

El 21/02/2013 23:50, "NeoRazorX" <neor...@gmail.com> escribió:
--

deavid

unread,
Feb 22, 2013, 2:32:45 AM2/22/13
to ene...@googlegroups.com
Sobre redondeos, hay que tener en cuenta el error de precisión del float, que hace que ( 1.1 + 2.2 != 3.3 )
Y con los redondeos es aún más divertido, por lo que comenta Aulla, math.round(100*33.123123) / 100 != 33.12

(Esto ocurre tanto en PHP, en QS y en cualquier lenguaje de programación. Creo que en Python lo explican bastante bien: http://docs.python.org/2/tutorial/floatingpoint.html )

Ahora bien, esto es una cosa, y un descuadre de 1 céntimo es otra completamente distinta. Por mucho que los float no pueden almacenar decimales en base 10 con precisión, no justifica los descuadres de céntimos.

En contabilidad, hay que asegurarse que todas las operaciones tienen exactamente los redondeos donde deben tenerlos, ni más ni menos, porque de lo contrario, empezarían a descuadrar céntimos en algunas operaciones.

NeoRazorX

unread,
Feb 22, 2013, 2:56:42 AM2/22/13
to ene...@googlegroups.com
Hola,
En unos pocos casos FacturaScripts genera asientos con valores de más de dos decimales. He modificado los algoritmos para que esto no suceda más. Para los asientos ya generados he creado una función que redondea los valores, pero al aplicarla he visto que en un par de casos genera descuadres de un céntimo, es decir, los valores originales son: 15.88482 + 75.642 = 91.52682, que al redondear se queda en: 15.88 + 75.64 = 91.53, pero no suman 91.53. Lo que voy a hacer en estos casos es sumarle un céntimo a la cifra cuyo tercer decimal y siguientes sea más alta. Pero esto, como ya he dicho es para asientos ya creados, Para los nuevos redondearé bien previamente.

deavid

unread,
Feb 22, 2013, 3:17:34 AM2/22/13
to ene...@googlegroups.com
¿Sumar un céntimo mirando el tercer decimal? Suena a que estás redondeando mal.

Aunque parezca una tontería o algo evidente, hay más de una forma de redondear:
- ceil(x) - Redondear por arriba, al siguiente entero.
- floor(x) - Redondear por abajo, al entero anterior.
- convertir a entero (con int(x) o parseInt(x), etc), se descarta la información de los decimales. Es por tanto equivalente a floor(x)
- round(x) - Redondear al entero más próximo, es decir, mirando el siguiente decimal y si es 5 o más redondeamos hacia arriba, en caso contrario hacia abajo.

Normalmente cuando hablamos de redondear, nos referimos a lo que hace la función round(x).


Más cosas... las siguientes operaciones no dan lo mismo:
1) x + y = z
2) round(x) + round(y) = z
3) round(x + y) = z

Pero lo que sí es lo mismo es: round(x) + round(y) == round( round(x) + round(y) )

Y cuando se redondea, lo que se pretende es perder información, y claro, no va a dar lo mismo.

Por ejemplo, si estamos calculando el neto de la factura y hay una línea con 15.88482 y otra con 75.642 de total, en realidad debes redondearlas y guardarlas redondeadas. Posteriormente el total neto sería 15.88 + 75.64 = 91.52

NeoRazorX

unread,
Feb 22, 2013, 3:23:40 AM2/22/13
to ene...@googlegroups.com
Para facturas nuevas redondeo como tú dices, ¿Pero para las que ya he creado y que tengo con un montón de decimales? ... Al cliente le he cobrado 91.53 ... ¿Dónde meto ese céntimo de más?

deavid

unread,
Feb 22, 2013, 3:45:53 AM2/22/13
to ene...@googlegroups.com
Tendrías que modificar a mano el contenido de la factura, según el caso te convendría ponerlo en un sitio o en otro.
Pero básicamente, si es en el total neto donde ya tienes el céntimo descuadrado, lo lógico sería mover el error hacia las operaciones anteriores, es decir, modificar el total de una de las líneas y ponerle un céntimo de más. Luego para que te cuadre todo tendrás que cambiar el precio de la línea, pero eso es más a efectos de imprimir la factura. Es decir, contablemente, lo importante son los totales por línea, los impuestos, el neto y el total factura. El precio del artículo, descuentos y otras cosas, si contienen un error, apenas tiene importancia.

NeoRazorX

unread,
Feb 27, 2013, 11:04:46 AM2/27/13
to ene...@googlegroups.com
Hola,
Me estaba rayando mucho con esto problema, así que decidí empezar desde cero. Volvía a cargar el backup de la base de datos sobre la que trabajo. Calculé el descuadre del ejercicio, resultado 1.91€. Encontré el asiento descuadrado y lo regeneré. Resultado: descuadre de 3 céntimos en el ejercicio. Actualicé los saldos de todas las subcuentas y volví a calcular el descuadre. Resultado: ejercicio sin descuadre. Es decir, el problema eran los saldos de las subcuentas, problema que he solucionado en la última versión de FacturaScripts.

En definitiva, los asientos que genera FacturaScripts son correctos, el fallo lo produje yo al intentar solucionar el problema. Lo bueno es que ahora FacturaScripts incluye un proceso para examinar todos los asientos en busca de errores.
Reply all
Reply to author
Forward
0 new messages