Problema al redondear número en JAVA

Publicado en 'Programación' por EruKun, 24 Oct 2010.





  1. EruKun

    EruKun Miembro maestro

    Registro:
    15 Nov 2008
    Mensajes:
    254
    Likes:
    10




    bueno mi problema es que con ciertos números, el redondeo no me funciona, bueno en realidad si funciona pero la suma con otro número le quita el redondeo.

    el algoritmo que uso para redondear que esta en la clase Operacion es
    Código:
    public double conversionDecimal(double numero){
    
            //DecimalFormat df = new DecimalFormat("0.00"); 
            //return Double.valueOf(df.format(numero));
            //return Math.rint(numero*100)/100;
    [COLOR=Red]
            return Math.round(numero*Math.pow(10,2))/Math.pow(10,2);[/COLOR]
        }
    

    la parte donde capturo datos y muestro resultados en la consola
    pVenta es double.
    op es de la clase Operacion
    Código:
    int cantidad = Integer.valueOf(jsCantidadVenta.getValue().toString());
            [COLOR=Red]subTotall += pVenta*cantidad;
            igvTotal = op.conversionDecimal((subTotall)*0.19);
            total=subTotall+igvTotal;[/COLOR]
            JLsubTotal.setText(String.valueOf(subTotall));
            JLigvTotal.setText(String.valueOf(igvTotal));
            JLTotal.setText(String.valueOf(total));
            System.out.println(subTotall);
            System.out.println(igvTotal);
            System.out.println(subTotall+igvTotal);
    

    el resultado que bota en la consola
    Código:
    1.0
    0.19
    1.19
    2.0
    0.38
    2.38
    3.0
    0.57
    3.57
    4.0
    0.76
    4.76
    5.0
    0.95
    5.95
    6.0
    1.14
    7.14
    7.0
    1.33
    8.33
    8.0
    1.52
    9.52
    9.0
    1.71
    10.71
    10.0
    1.9
    11.9
    11.0
    2.09
    13.09
    12.0
    2.28
    14.28
    13.0
    2.47
    15.47
    14.0
    2.66
    16.66
    15.0
    2.85
    17.85
    16.0
    3.04
    19.04
    17.0
    3.23
    20.23
    18.0
    3.42
    21.42
    19.0
    3.61
    22.61
    20.0
    3.8
    23.8
    21.0
    3.99
    [COLOR=Red]24.990000000000002[/COLOR]
    
    

    cuando subtotal es 21, el total(21+3.99) me sale 24.99000000....2
    lo mismo ocurre cuando esta en 33+6.27 => 39.2699....6 lo raro es que el igv siempre sale en 2 decimales, pero la suma con el subtotal sale diferente
    necesito todo en 2 decimales >.<
     
    Última edición: 24 Oct 2010


  2. AwesoMarron

    AwesoMarron Miembro maestro

    Registro:
    14 Abr 2010
    Mensajes:
    549
    Likes:
    56
    Has todo tu manejo de números dobles con la clase Double en lugar del primitivo double.
     
  3. EruKun

    EruKun Miembro maestro

    Registro:
    15 Nov 2008
    Mensajes:
    254
    Likes:
    10
    bueno, cambio todos los que tenga double a Double(por cierto tuve que cambiar X=0 a X=0.0), hasta el método en vez de double a Double y sigue con el mismo error.
     
  4. AwesoMarron

    AwesoMarron Miembro maestro

    Registro:
    14 Abr 2010
    Mensajes:
    549
    Likes:
    56
    hmm... sorry, quise decir BigDecimal :plop:

    BigDecimal tiene sus propios métodos para las 4 operaciones básicas. Si lo implementas, ya no necesitarás el método conversión decimal.

    No olvides que lo recomendable es crear nuevos objetos BigDecimal a partir de Strings

    BigDecimal x = new BigDecimal("0.19");
     
  5. EruKun

    EruKun Miembro maestro

    Registro:
    15 Nov 2008
    Mensajes:
    254
    Likes:
    10
    muchas gracias :yeah: soluciono el problema con el BigDecimal
    use esto:

    Código:
    double subTotal;
    double igvTotal;
    double total;
    
    public void calcularIGVyTotal(double sub){
            BigDecimal a = new BigDecimal(String.valueOf(sub));
            BigDecimal b = new BigDecimal("0.19");
            BigDecimal c = a.multiply(b);        
            igvTotal=c.doubleValue();
            c = c.add(a);System.out.println(c);
            total=c.doubleValue();
    }
     
    Última edición: 24 Oct 2010
  6. el_ken

    el_ken Miembro nuevo

    Registro:
    2 Mar 2007
    Mensajes:
    46
    Likes:
    1
    un comentario que no tiene q ver con el post en si.... lo someto a opinión del administrador.... cuando se da por solucionado el problema... el autor del post despues de confirmar la solución deberia cambiar el situlo del post... o en todo caso agregarle al titulo actual una etiqueta de "[Solucionado]"... para asi poder identifiar cuales son los problemas q aun faltan solucionar... y tb identificar cuales ya estan solucionados...