2010-06-29 4 views
4

есть лучший способ умножить и разделить цифры, чем с использованием * и /?Ошибка вычисления Javascript

Существует странное поведение в Chrome Firefox и Internet Explorer с помощью этих operaters:

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

http://jsbin.com/ekoye3/

Я пытаюсь округлить пользовательский ввод с parseInt (x1 * 100)/100 и результат для 9999.8 является 9999.79

Должен ли я использовать другой способ достижения этого?

ответ

7

Это не ошибка. Вы можете проверить:

Integer арифметика с плавающей точкой является точной, поэтому ошибки в десятичных представление можно избежать путем масштабирования. Например:

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 - большое вам спасибо – jantimon

+0

целочисленная арифметика только точна вплоть до точки, в сущности 1 ULP! = 1 –

1

Вы можете использовать toFixed() метод:

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

Спасибо - не знал '.toFixed' отлично работает. Однако вы, вероятно, означали 'x1.toFixed (2)' вместо этого, не так ли? – jantimon

1

You may want to check this. Если вы хотите делать вычисления на числах, представляющих деньги, вы должны подсчитать центы и использовать целые числа.

Смежные вопросы