[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.
One Response 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