Arrondi commercial problématique
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:
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 :
Code:
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);
}
} |
et son effet:
Code:
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
[...] |
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...
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 !