我有一个对象,它在 mySql 上有一个数据类型为 Decimal(10,2) 的 money 属性。
我的 javascript 发出一个 http 请求来检索这些值,我在我的 javascript 函数中处理数据以将所有值加到一个 $scope 中:
$scope.expected = 0;
for(var k = 0; k < collection.length; k++)
{
$scope.expected += Number(collection[k].price);
}
price
是包含 125.89
作为来自数据库的值的货币值。迭代进行了 31 次迭代,因为 collection.length
返回我 31
。
我使用了 Number
引用,因为它开始时是一个字符串。
当循环结束时,我得到这个总和:3902.589999999999
但我想要的只是 3902.58
,因为这是钱,它必须是一个精确的表示。我四处研究,社区似乎同意使用 toFixed(2)
但据我了解,toFixed(2)
将数字四舍五入,这是我不想做的事情因为这个操作涉及现金。
有没有办法保留小数点后两位而不四舍五入?
我还在整个循环中保留了 console.log 的日志。这是结果:
125.89
251.78
377.67
503.56
629.45
755.34
881.23
1007.12
1133.01
1258.9
1384.7900000000002
1510.6800000000003
1636.5700000000004
1762.4600000000005
1888.3500000000006
2014.2400000000007
2140.1300000000006
2266.0200000000004
2391.9100000000003
2517.8
2643.69
2769.58
2895.47
3021.3599999999997
3147.2499999999995
3273.1399999999994
3399.0299999999993
3524.919999999999
3650.809999999999
3776.699999999999
3902.589999999999
最佳答案
从您的帖子看来,您正在处理正数。
如果你想 chop 最终结果,你可以像这样调用 Math.floor 来实现
$scope.expected = Math.floor($scope.expected * 100)/100;
但是,如果你想在求和之前将每个数字 chop 到小数点后两位,那么你可以使用以下内容
$scope.expected = 0;
for(var k = 0; k < collection.length; k++)
{
$scope.expected += Math.floor(Number(collection[k].price) * 100) / 100;
}
请注意,这仅在所有数字均为正数(大于或等于零)时才有效。
如果你期望负数,你可以设计一个函数如下:
truncateNumber = function (number) {
if(number < 0){
return Math.ceil(number * 100) / 100;
}else{
return Math.floor(number * 100) / 100;
}
};
例子
使用其中之一
$scope.expected = truncateNumber($scope.expected);
或
for(var k = 0; k < collection.length; k++)
{
$scope.expected += truncateNumber(Number(collection[k].price));
}
关于Javascript 加法给我一个多于 2 位小数的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27223938/