Je dois lire des nombres dans une base de données et les écrire dans un fichier texte en utilisant Perl.
Dans le tableau où figurent les nombres, le format des données est défini comme suit numeric (25,5)
(il lit 25 chiffres, dont 5 décimales).
Je formate les nombres dans mon fichier avec un sprintf "%.5f", $myvalue
pour forcer 5 décimales et je viens de remarquer que pour les grandes valeurs, il y a une perte de précision pour les nombres avec plus de 17 chiffres :
db = 123.12345
file = 123.12345 (OK)
db = 12345678901234891.12345
file = 12345678901234892.00000 (seems to be rounded to upper integer)
db = 12345678901234567890.12345
file = 12345678901234567000.00000 (truncation ?)
Quelle est la plus grande précision de Perl pour les nombres décimaux fixes ?
Je suis conscient des concepts et des limites de l'arithmétique à virgule flottante en général, mais je ne suis pas un moine Perl et je ne connais pas les rouages de Perl, donc je ne sais pas si c'est normal (ou si c'est lié du tout à la virgule flottante). Je ne sais pas non plus s'il s'agit d'une limitation interne de Perl, ou d'un problème lié à la fonction sprintf
traitement.
Existe-t-il une solution de contournement ou un module dédié qui pourrait aider à résoudre ce problème ?
Quelques points notables :
- il s'agit d'une fonctionnalité supplémentaire d'un système qui utilise déjà Perl, de sorte que l'utilisation d'un autre outil n'est pas envisageable
- les données traitées sont financières, je dois donc conserver chaque centime et je ne peux pas m'accommoder d'une précision de +/- 10 000 unités :^S