[AS3] Opération mathématique de base avec un nombre décimal
19 juin 2008 – 23:17J'ai fait une petite découverte assez stupéfiante en faisant la somme de nombres décimaux en actionscript 3. L'exemple ci-dessous représente bien le problème :
Recopier le code suivant dans un fla vide et compilez !
var myNumber:Number = 0; for(var i:Number = 0; i<10; i++){ myNumber += 0.1; trace(myNumber); }
En fenêtre de sortie vous aurez le résultat suivant :
0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999
Par contre si vous recompilez le même fichier en actionscript 2, tout rentre dans l'ordre...
Après quelques recherches j’ai été encore plus surpris par la réponse d’adobe :
This is a fact of life in applications that use floating point arithmetic
Autrement dit : "C'est pas un bug alors démerde toi..."
Conclusion je trouve ça énorme que des problèmes de ce genre surviennent en actionscript 3 alors que tout allait bien actionscript 2. En attendant je me contente de faire passer tous mes nombres par une méthode qui corrige l'erreur...
var myNumber:Number = 0; for(var i:Number = 0; i<10; i++){ myNumber += 0.1; myNumber = correctIt(myNumber); trace(myNumber); } function correctIt(value:Number){ return Math.round(value*100)/100; }
Résultat :
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
C'est pas très esthétique je sais mais je suis ouvert aux autres solutions, n'hésitez pas.
Un thread à ce sujet sur le forum de Kirupa.

3 Responses to “[AS3] Opération mathématique de base avec un nombre décimal”
function floorTo(input:Number, rounding:Number = 1):Number
{
// temporarily make number positive, for efficiency
var isNegative:Boolean = input < 0;
if (isNegative)
input *= -1;
var out:Number = (Math.floor(input / rounding)) * rounding;
return isNegative ? – out: out;
}
trace(floorTo(412.345, .2)); // 412.20000000000005
on est pas sortir de l’auberge….
By taisen on oct 17, 2008
Salut,
Ma solution de la nuit:
utiliser:
variable.toFixed(y)
avec « y » nombre de décimales aprés la virgule.
Pour ma part le problème est « résolu » ainsi.
By Solage on oct 24, 2011
utilise un type int plutot que number..
c’est en effet normal, c’est la représentation flottante ça te le fera dans tous les langage pas seulement en as3, tu peux tester en C, si tu définit un nombre flottant et que tu le fait égale à 3, ça t’écriras aussi 3.0000000000000004
By Pierre on nov 13, 2011