2010-08-27 5 views

Répondre

3

Utilisez la fonction de Lua string.format:

print(string.format('%.02f', 10.08 - 10.07)) 
11

Vous avez obtenu 0,01 de la soustraction. C'est juste sous la forme d'une décimale répétitive avec une petite quantité de précision perdue.

Lua utilise le type de C double pour représenter des nombres. Il s'agit, sur presque toutes les plates-formes que vous utiliserez, d'une valeur à virgule flottante binaire de 64 bits avec environ 23 chiffres décimaux de précision. Cependant, aucune précision n'est suffisante pour représenter exactement 0,01 en binaire. La situation est similaire à tenter d'écrire 1/3 en décimal.

De plus, vous soustrayez deux valeurs qui sont très similaires en grandeur. Cela seul entraîne une perte de précision supplémentaire.

La solution dépend de votre contexte. Si vous faites de la comptabilité, alors je vous recommande fortement de ne pas utiliser les valeurs à virgule flottante pour représenter les valeurs du compte car ces petites erreurs s'accumuleront et éventuellement des cents entiers (ou pire) apparaîtront ou disparaîtront. Il est préférable de stocker les comptes en cents entiers et de diviser par 100 pour l'affichage.

En général, la réponse est d'être au courant des problèmes qui sont inhérents à virgule flottante, et l'un d'eux est ce genre de petite perte de précision. Il est facilement manipulé en arrondissant les réponses à un nombre approprié de chiffres pour l'affichage, et en ne comparant jamais les résultats des calculs pour l'égalité.

Quelques ressources pour le fond:

Édition: Ajout du document WECSSKAFPA après tout. Cela vaut vraiment la peine d'être étudié, même si cela semble un peu accablant au premier passage. Dans la même veine, Knuth Volume 2 a une couverture étendue de l'arithmétique en général et une grande partie sur le point flottant. Et, puisque lhf m'a rappelé son existence, j'ai inséré l'explication du wiki de Lua expliquant pourquoi le virgule flottante peut être utilisé comme seul type numérique comme premier élément de la liste.

+0

+1 très bonne réponse. J'aimerais aussi ajouter une référence si OP a envie de creuser - «Ce que tout informaticien devrait savoir sur les nombres à virgule flottante» à http://docs.sun.com/source/806-3568/ncg_goldberg.html – sbk

+0

J'ai renversé une pièce et décidé de la laisser de la liste ... c'est un peu écrasant en première lecture. Mais je recommande absolument de le lire et de le comprendre aussi, donc je vais éditer le lien là où il est le plus visible. – RBerteig

Questions connexes