我有一张表,其中我总结了从零开始的值。
我得到的一些价值观是错误的。我使用.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]);
};
});
答案 0 :(得分:1)
这是最疯狂的:&#39; $ -99.99&#39;再加上99.99美元&#39;给出$ -1.42&#39;
这不是真的,你得到的结果是:
-1.4210854715202004e-14
接近:
0.00000000000001421085...
(见负指数)
要避免浮点问题,请在进一步使用它们之前尝试舍入总和。由于浮动存储在内存中的方式而发生这种情况 - 如果您有兴趣更详细地了解该主题,那么该主题上有大量的在线资源。