Historias
Slashboxes
Comentarios
 
Este hilo ha sido archivado. No pueden publicarse nuevos comentarios.
Mostrar opciones Umbral:
Y recuerda: Los comentarios que siguen pertenecen a las personas que los han enviado. No somos responsables de los mismos.
  • me quedo tieso

    (Puntos:1, Interesante)
    por pobrecito hablador el Miércoles, 03 Abril de 2013, 22:25h (#1334556)
    ¿el problema de los redondeos?
    ¿me dices que haces las operaciones con decimales en punto flotante?
    de BigDecimal ni hablamos, ¿verdad?

    un big NO-NO es usar floats para el parné, la pasta, la guita. se usan DECIMAL o NUMERIC o como lo llame tu base de datos, si es que es medio decente y lo implementa.

    antes de responderme todo gallo, haz el favor de buscar en google sobre este tópico y luego te das unos cabezazos con la pared mientras piensas en todos los desastres esperando estallar que tienes en producción ahora mismo.
    [ Padre ]
    Puntos de inicio:    0  puntos
    Moderación   +1  
    Modificador extra 'Interesante'   0  

    Total marcador:   1  
  • por pleyades (544) el Jueves, 04 Abril de 2013, 19:25h (#1334620)
    ( http://barrapunto.com/ | Última bitácora: Viernes, 29 Diciembre de 2017, 18:26h )

    No tiene nada que ver el tipo de datos (aparte de que no se donde ha dicho que use coma flotante) con el problema del redondeo. Si usas cantidades con distintos decimales, dependiendo del orden de los cálculos, puede dar distintos resultados.

    El que uses un formato de coma fija sólo implica que los redondeos los hace el sistema automáticamente y, dependiendo de que en que orden asignes los valores, hará distintos redondeos y puede dar distintos resultados.

    Pongamos este ejemplo de dos líneas:

    precio 1.0004 cantidad 10.0000 importe_linea 10.0040
    precio 1.0003 cantidad 10.0000 importe_linea 10.0030
    Total factura 10.0070

    Suponiendo que total factura es decimal(10,2):

    Si importe_linea es decimal(10,2) obtendrás total factura=10.00.
    Si importe_linea es decimal(10,4) obtendrás total factura=10.01.

    Optando por un formato u otro has tomado la decisión de en que punto del cálculo redondeas. Exactamente igual que si hubieras usando un round con un float.

    Empieza a probar calcular las cuotas por línea y sumarlas después, frente calcular la cuota sobre el total, y jugando con el número de decimales fijos en cada caso, verás los descuadres que te pueden salir aunque uses coma fija.

    Los decimales fijos te evitan algunas sorpresas de los floats, ya que los decimales que ves son los que hay, no hay decimales ocultos. Con floats te puede pasar cosas raras, como por ejemplo, comparar una cantidad que aparentemente es cero y resulta que es 1e-17, o en sumas que te suma decimales ocultos.

    Pero el problema de que, cuando haces redondeos el orden de las operaciones afecta al resultando, sigue existiendo, con o sin floats. Y es concretamente lo que pregunta ¿Se calcula la cuota de IVA por línea, por el total? ¿Se redondea? ¿Cuándo?

    [ Padre ]