javascript - 具有规定精度的分割金额且无舍入误差

标签 javascript

由于缺乏更好的词,我需要一种方法将金额(以美元为单位)分配给一个或多个“桶”。它需要具有美元金额应有的标准小数点后两位精度,但每一分钱都需要计算在内。

为了说明问题,请考虑以下示例:

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/

相关文章:

javascript - Jquery.submit() - 在提交之前更改表单值

javascript - Javascript 中的 Html.Partial

javascript - 在 tbody 内的 <tr> 标记内获取输入?

快速打字时,Javascript onKeyUp 条件不起作用

javascript - 动态更改 Highstock 中的范围

javascript - 使用 Discord.js 从 channel 获取 channel 类别

javascript - PHP 不向 JS 发送变量

javascript - 如何搜索由变量确定的特定数组?

javascript - 错误 : Cannot define class using reflection

javascript - 如何避免office-js中过多的context.loads()