javascript总和出错

时间:2015-11-09 16:13:50

标签: javascript

我有一张表,其中我总结了从零开始的值。

我得到的一些价值观是错误的。我使用.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]);
    };
});

1 个答案:

答案 0 :(得分:1)

  

这是最疯狂的:&#39; $ -99.99&#39;再加上99.99美元&#39;给出$ -1.42&#39;

这不是真的,你得到的结果是:

-1.4210854715202004e-14

接近:

0.00000000000001421085...

(见负指数)

要避免浮点问题,请在进一步使用它们之前尝试舍入总和。由于浮动存储在内存中的方式而发生这种情况 - 如果您有兴趣更详细地了解该主题,那么该主题上有大量的在线资源。