Problème avec float et double :
Exemple 1 :
Calcul incorrect lors de la soustraction des montants en dollars :
System.out.println(1.03 - 0.42); // Resultado: 0.6100000000000001
Exemple 2 :
Erreur lors de l'achat de neuf articles à 10 centimes chacun :
System.out.println(1.00 - 9 * 0.10); // Resultado: 0.09999999999999998
Même en arrondissant, des erreurs persistent.
Problème avec les calculs progressifs, comme lors de l'achat de bonbons à des prix incrémentiels de 0,10 à 1,00.
Exemple 3 :
Erreur lors de l'achat de bonbons jusqu'à ce que vous n'ayez plus d'argent :
double funds = 1.00; for (double price = 0.10; funds >= price; price = 0.10) { funds -= price; } System.out.println(funds); // Resultado: 0.3999999999999999
Solution 1 : utiliser BigDecimal
Exemple avec BigDecimal :
BigDecimal funds = new BigDecimal("1.00"); BigDecimal price = new BigDecimal("0.10"); int itemsBought = 0; while (funds.compareTo(price) >= 0) { funds = funds.subtract(price); price = price.add(new BigDecimal("0.10")); itemsBought ; } System.out.println(itemsBought " items bought. Money left: " funds); // Resultado: 4 items bought. Money left: 0.00
Le calcul est désormais précis.
Inconvénients de BigDecimal :
Solution 2 : utiliser int ou long
Exemple avec int (en centimes) :
int funds = 100; // 1.00 dólar = 100 centavos int price = 10; // 0.10 dólar = 10 centavos int itemsBought = 0; while (funds >= price) { funds -= price; price = 10; itemsBought ; } System.out.println(itemsBought " items bought. Money left: " funds); // Resultado: 4 items bought. Money left: 0
Le calcul est rapide et précis.
Conclusion:
Choix :
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3