Le type Currency dans Delphi est un entier de 64 bits mis à l'échelle de 1/10 000; en d'autres termes, son plus petit incrément est équivalent à 0,0001. Il n'est pas sensible aux problèmes de précision de la même manière que le code à virgule flottante.
Toutefois, si vous multipliez vos nombres monétaires par des nombres à virgule flottante ou si vous divisez vos valeurs monétaires, l'arrondi doit être calculé d'une manière ou d'une autre. La FPU contrôle ce mécanisme (c'est ce qu'on appelle le "mot de contrôle"). L'unité Math contient certaines procédures qui contrôlent ce mécanisme: SetRoundMode en particulier. Vous pouvez voir les effets de ce programme:
{$APPTYPE CONSOLE}
uses Math;
var
x: Currency;
y: Currency;
begin
SetRoundMode(rmTruncate);
x := 1;
x := x/6;
SetRoundMode(rmNearest);
y := 1;
y := y/6;
Writeln(x = y); // false
Writeln(x - y); // 0.0001; i.e. 0.1666 vs 0.1667
end.
Il est possible qu'une bibliothèque tierce que vous utilisez est mise le mot de commande à une valeur différente. Vous pouvez définir explicitement le mot de contrôle (c'est-à-dire le mode d'arrondi) au point de départ de vos calculs importants. En outre, si vos calculs sont transférés en virgule flottante et ensuite en devise, tous les paris sont désactivés, ce qui est trop difficile à vérifier. Assurez-vous que tous vos calculs sont en devise.
Méfiez-vous que l'arithmétique entre les types de devises se fait en utilisant des instructions à virgule flottante. Le résultat est susceptible d'erreurs d'arrondi en raison de la représentation binaire en virgule flottante. –