1
tvTotalCommande.setText(String.valueOf(totalCommande)+"€");
    tvTotalRegler.setText(String.valueOf(totalDescuento+"€"));
    tvRemises.setText(String.valueOf((totalCommande-totalDescuento)+"€"));

En TotalCommande me escribe 5.5

En Remises me escribe 1.0999999996

En Total a Regler me escribe 4.4

Si los resto deberian dar 1.1 Pero me esta dando el 1.0999999996

Necesito que me salga el resultado en 1.1 HELP!

Eduardo Ricardez
  • 563
  • 2
  • 12
  • Proba utilizando Math.round() – Ivan Koop Apr 25 '17 at 21:35
  • @IvanKoop Me lo deja en 1 – Eduardo Ricardez Apr 25 '17 at 21:38
  • ¡Bienvenido al apasionante mundo de la aritmética en punto flotante! El problema de base es que no todos los números decimales son representables por un número en punto flotante, así que puede haber errores de redondeo al convertir de decimal a binario. [Aquí se explica bastante bien](https://es.stackoverflow.com/questions/4308/por-qu%c3%a9-tengo-problemas-con-los-valores-decimales-utilizando-bigdecimal/4309#4309). Moraleja. Nunca uses punto flotante para nada que sea importante. – SJuan76 Apr 25 '17 at 21:38

1 Answers1

1

Lo resolví asi :

Una manera de urgencia para repararlo y que ha quedado a la perfección para todos los casos ha sido este :

 String prueba= String.valueOf(totalCommande);
    String prueba2=String.valueOf(totalDescuento);

    BigDecimal a = new BigDecimal(prueba);
    BigDecimal b = new BigDecimal(prueba2);

    a=a.setScale(2, RoundingMode.HALF_UP);
    b=b.setScale(2,RoundingMode.HALF_UP);


    tvTotalCommande.setText(String.valueOf(a)+"€");
    tvTotalRegler.setText(String.valueOf(b)+"€");

Pasar los Doubles a String y de String a BigDecimal y el BigDecimal Redondearlo utilizando setScale con RoundingMode.HALF_UP. Porque CEILING lo deja en 1.2 , pero HALF_UP lo deja en 1.1, siendo 2 decimales pues ya queda a manera de dinero , 1.10

Eduardo Ricardez
  • 563
  • 2
  • 12