由于缺乏更好的词,我需要一种方法将金额(以美元为单位)分配给一个或多个“桶”。它需要具有美元金额应有的标准小数点后两位精度,但每一分钱都需要计算在内。
为了说明问题,请考虑以下示例:
200 美元分成 3 种方式。如果四舍五入,每笔金额为 66.66 美元,最终少了 2 美分,但如果四舍五入,每笔金额为 66.67 美元,多了 2 美分。答案当然是一个 66.66 美元,另外两个 66.67 美元。这对于人类来说很容易推理,但试图让 JavaScript 理解这一点是一个挑战。
最佳答案
这是我想出的函数:
function SplitTotal( totalAmount, numberToSplit, precision ) {
var precisionFactor = Math.pow(10, precision);
var remainderFactor = 1 / precisionFactor;
var splitAmount = Math.ceil( totalAmount / numberToSplit * precisionFactor ) / precisionFactor;
var remainder = Math.round( (splitAmount * numberToSplit - totalAmount) * precisionFactor ) / precisionFactor;
var result = [];
for (var i = 0; i < numberToSplit; i++) {
result.push( (remainder >= remainderFactor) ?
Math.round( (splitAmount - remainderFactor) * precisionFactor ) / precisionFactor :
splitAmount );
remainder = Math.round( (remainder - remainderFactor) * precisionFactor ) / precisionFactor;
}
return result;
}
代码有点复杂,因为 JavaScript 处理 float 的方式很糟糕。为了获得一个好的、精确的小数金额,您需要将该金额乘以我在此所说的“精度因子”(它只是 10 的某个指数),对所得数字进行四舍五入,然后除以该精度因子即可得到返回到原来的小数精度。
尽管我只需要 2 个小数位的精度,但我使精度可以轻松定义,因此这可以适用于更多的应用程序,而不仅仅是美元金额。如果您只需要整数,则可以指定精度 0。
例如:235.38 美元分为 7 种:
> SplitTotal(235.38, 7, 2)
[33.62, 33.62, 33.62, 33.63, 33.63, 33.63, 33.63]
关于javascript - 具有规定精度的分割金额且无舍入误差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18902693/