FAQ n°2644, publiée le 20/02/2003
Sur une opération impliquant un nombre déclaré en "réel", il m'arrive parfois de perdre des décimales. Pourquoi ?
L'imprécision (relative) des réels sur les décimales provient du codage binaire en virgule flottante (codage IEEE). Ce codage  IEEE-754 est utilisé par quasiment tous les langages de programmation (C, C++, C#, JAVA, WLangage). 

Avant d'aller plus loin, précisons immédiatement qu'il y a une solution très simple pour ne pas perdre de décimales : il suffit d'utiliser le type monétaire qui est parfaitement précis.

L'imprécision du codage binaire concerne les chiffres à droite de la virgule. En effet en codage binaire, chaque 1 à droite de la virgule est une fraction de deux: 1/2, 1/4, 1/8, 1/16, etc.

Certains nombres sont faciles à coder: par exemple 0.75 en décimal s'écrit 0.11 en binaire (1/4 + 1/2) (bien entendu, une machine ne connait au final que le binaire !). En revanche, 0.8 est impossible à obtenir en additionnant des fractions de 2. Si on choisit de s'arrêter à 10 chiffres après la virgule, 0.8 en décimal s'écrira 0.1100110011 en binaire, soit 1/2 + 1/4 + 1/32 + 1/64 + 1/1024 + 1/2048. Mais il y reste encore beaucoup d'autres chiffres après ces 10 décimales pour arriver "exactement" à 0.8. La valeur est tronquée, d'où l'absence de précision.