Ошибка вычисления Javascript - PullRequest
4 голосов
/ 29 июня 2010

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

В Chrome Firefox и Internet Explorer наблюдается странное поведение при использовании этих операторов:

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

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

Ответы [ 3 ]

7 голосов
/ 29 июня 2010

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

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

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
1 голос
/ 29 июня 2010

Вы можете проверить это . Если вы хотите вычислить числа, представляющие деньги, вы должны считать центы и использовать целые числа.

1 голос
/ 29 июня 2010

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

var a = parseInt ( x1 * 100 ) / 100;
var result = a.toFixed( 1 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...