2015-11-09 2 views
0

У меня есть таблица, в которой я суммирую значения, начиная с нуля.Ошибка в javascript sum

Некоторые значения, которые я получаю, являются неправильными. Я предлагаю .toFixed(2), чтобы показать результаты пользователю.

Я использовал console.log видеть внутри суммы:

> 0 - 70 = -70 
> -70 + 1182 = 1112 
> 1112 - 970 = 142 
> 142 - 900 = -758 
> -758 - 300 = -1058 
> -1058 - 210 = -1268 
> -1268 - 150 = -1418 
> -1418 - 150 = -1568 
> -1568 - 40 = -1608 
> -1608 + 1182 = -426 
> -426 - 450 = -876 
> -876 - 39.6 = -915.6 
> -915.6 + 1182 = 266.4 
> 266.4 - 39.6 = 226.79999999999998 
     // the problem starts here to down 
> 226.79999999999998 - 226.79 = 0.009999999999990905 
> 0.009999999999990905 - 100 = -99.99000000000001 
> -99.99000000000001 + 99.99 = -1.4210854715202004e-14 
    // this is the most crazy: '$ -99.99' plus '$ 99.99' gives '$ -1.42' 
> -1.4210854715202004e-14 + 1.42 = 1.4199999999999857 

Как я могу обойти эту ситуацию?


@Bergi. Мой код:

$http.get('/app/php/planData.php').success(function(data){ 
    for (var i=0, l=data.length; i<l; i++) { 
     var out = data[i].out; 
     var before = parseFloat(i ? data[i - 1].subtotal : 0); 
     var cash = parseFloat(data[i].cash); 
     data[i].subtotal = out ? before - cash : before + cash; 
     console.log(before + (out? ' - ' : ' + ') + cash + ' = ' + data[i].subtotal); 
    } 
    $scope.dataPlan = data; 
    loading('off'); 
}).error(function(){ console.log('Error searching Plan data.'); }); 

HTML:

<span style="color: {{mov.subtotal < 0 ? '#f00' : 
(mov.subtotal > 0 ? '#00f' : '#000')}}" 
ng-bind="mov.subtotal | mymoney"></span> 

фильтр:

appModule.filter('mymoney', function() { 
    return function (input) { 
     return input && ('$ ' + String(input).match(/^\-?\d+(?:\.\d\d?)?/)[0]); 
    }; 
}); 
+2

Вы обходите эту ситуацию, понимая [IEEE 754 с плавающей запятой] (https://en.wikipedia.org/wiki/IEEE_floating_point). – Phylogenesis

+0

Знаете ли вы, что означает 'e-14'? – Bergi

+0

@Bergi. Я думал, что это 14 нулей –

ответ

1

это самый сумасшедший: '$ -99,99' плюс '$ 99,99' дает «$ - 1.42 '

Это неправда, результат yo u're получаю:

-1.4210854715202004e-14 

который близок к:

0.00000000000001421085... 

(см отрицательный показатель)

Чтобы избежать плавающей запятой проблемы, попробуйте округление суммы, прежде чем использовать их в дальнейшем. Это происходит из-за того, что поплавки хранятся в памяти - на эту тему есть много онлайн-ресурсов, если вы заинтересованы в более детальной учебе.

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