Javascript случайные бесконечные числа

Прямо сейчас я работаю над программой типа бухгалтерской книги в веб-приложении. Я использую angularJS для обработки событий, но это необработанный Javascript, который обрабатывает фактические вычисления.

var onEntriesSuccess = function(data) {
    var sum = 0;
    var isDebit = ($scope.account.active == "D" ? true : false);
    angular.forEach(data, function(value, key){
        sum += (isDebit ? value.debit - value.credit : value.credit - value.debit);
        value.balance = sum;
    });

    $scope.entries = data;
}

Что, кажется, работает нормально; однако при запуске его в моем тестовом примере я обнаружил, что он терпит неудачу, потому что, когда сумма = 10496,82 и попытки вычесть 6912,00, получается

3584.8199999999997

Я никогда раньше не сталкивался с такой ошибкой, сначала я подумал, что это ошибка с плавающей запятой, и поменял значение с 6912,02 на 6912,00. Однако, похоже, это ничего не исправляет. Кто-нибудь может объяснить это? Спасибо


person Jujunol    schedule 13.10.2015    source источник
comment
ты можешь сделать скрипку?   -  person J Santosh    schedule 13.10.2015
comment
Нет необходимости в скрипке, это вызвано использованием javascript системы чисел с плавающей запятой: stackoverflow.com/questions/1458633/   -  person Saar    schedule 13.10.2015
comment
вы можете легко воспроизвести его, выполнив 0.1+0.2 == 0.3, что приведет к ложному результату, поскольку фактический результат 0.1+0.2 в JS будет 0,3000...4, опять же, это связано с системой счисления, которую использует JS   -  person Saar    schedule 13.10.2015
comment
подумайте об использовании value.balance = Math.round(sum * 100) / 100; (==3584.82), вероятно, лучшего обходного пути для такого рода странностей с плавающей запятой в javascript.   -  person davidkonrad    schedule 13.10.2015
comment
Fiddle: ссылка Правда, это имеет смысл, если бы вычиталось десятичное значение, а не просто 6912,00. Если я внесу изменения, чтобы числа давали 8496,82 - 912,00, тогда плавающей запятой не будет:/   -  person Jujunol    schedule 13.10.2015
comment
@Jujunol - да :) (Math.round(parseFloat(num) * 100) / 100).toFixed(2) см. различные примеры на jsfiddle.net/z18pmfkq .   -  person davidkonrad    schedule 13.10.2015


Ответы (1)


Я обновил вашу скрипку

Живая ссылка

sum=parseFloat(sum.toPrecision(16))

Я беру это решение из:

Ответ переполнения стека

person Arunkumar    schedule 13.10.2015