2010-06-29 4 views
4

Y at-il un meilleur moyen de multiplier et de diviser les chiffres que d'utiliser les * et /?Javascript calcul bug

Il y a un comportement étrange dans Chrome Firefox et Internet Explorer à l'aide de ces operaters:

x1 = 9999.8 
x1 * 100 = 999979.9999999999 
x1 * 100/100 = 9999.8 
x1/100 = 99.99799999999999 

http://jsbin.com/ekoye3/

Je suis en train de arrondir l'entrée utilisateur avec parseInt (x1 * 100)/100 et le résultat pour 9999.8 est 9999.79

Dois-je utiliser un autre moyen pour y parvenir?

Répondre

7

Ce bogue est pas. Vous voudrez peut-être consulter:

arithmétique entière en virgule flottante est exacte, alors les erreurs décimales de représentation peuvent être évités en mise à l'échelle. Par exemple:

x1 = 9999.8;       // Your example 
console.log(x1 * 100);     // 999979.9999999999 
console.log(x1 * 100/100);   // 9999.8 
console.log(x1/100);     // 99.99799999999999 

x1 = 9999800;       // Your example scaled by 1000 
console.log((x1 * 100)/10000);  // 999980 
console.log((x1 * 100/100)/10000); // 9999.8 
console.log((x1/100)/10000);  // 99.998 
+0

wow - merci beaucoup – jantimon

+0

l'arithmétique entière n'est exacte que jusqu'à un point, égalitairement 1 ULP! = 1 –

1

Vous pouvez utiliser la méthode toFixed():

var a = parseInt (x1 * 100)/100; 
var result = a.toFixed(1); 
+0

Merci - ne savait pas '.toFixed' cela fonctionne très bien. Cependant, vous vouliez probablement dire 'x1.toFixed (2)' à la place - n'est-ce pas? – jantimon

1

You may want to check this. Si vous voulez faire des calculs sur des nombres qui représentent de l'argent, vous devez compter des centimes et utiliser des nombres entiers.

Questions connexes