Salut !
Ma question est simple : comment réaliser un arrondi commercial d'un "double" à deux chiffres après la virgule ? Ou plutôt : pourquoi ma solution ne fonctionne pas correctement ?
J'avais d'abord pensé à ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 public static double arrondi(double somme) { return ((double) Math.round(somme * 100)) / 100; }
Problème :
Voici une utilisation de cette fonction :
et son effet:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 public static void main(String args[]) { double total = 1000, interets = 0, interets_arrondis = 0; for (int annee = 1; annee <= 10; annee++) { interets = total * 0.05; interets_arrondis = arrondi(interets); total += interets_arrondis; System.out.println("Après " + annee + " année(s) => intérêts : " + interets + " - arrondi : " + interets_arrondis + " - total : " + total); } }
On voit que tout se passe comme prévu jusqu'à la 4ème année, mais après le comportement devient plus étrange. A la quatrième année, l'arrondi est bien fait (57.88150000000001 => 57.88) mais quand on ajoute cet arrondi à une autre somme, on obtient pas le bon résultat : 1157.63 + 57.88 = 1215.5100000000002...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Après 1 année(s) => intérêts : 50.0 - arrondi : 50.0 - total : 1050.0 Après 2 année(s) => intérêts : 52.5 - arrondi : 52.5 - total : 1102.5 Après 3 année(s) => intérêts : 55.125 - arrondi : 55.13 - total : 1157.63 Après 4 année(s) => intérêts : 57.88150000000001 - arrondi : 57.88 - total : 1215.5100000000002 Après 5 année(s) => intérêts : 60.775500000000015 - arrondi : 60.78 - total : 1276.2900000000002 [...]
J'imagine que c'est une histoire de représentation machine des décimaux ou un truc comme ça... Quelqu'un pourrait-il m'expliquer ce qui se passe plus en détail ? Merci d'avance !






Répondre avec citation
Partager