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 :
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);
    }
  }
et son effet:
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
[...]
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 !