【问题标题】:Distributing currency/number across multiple items in array在数组中的多个项目中分配货币/数字
【发布时间】:2021-03-22 23:36:17
【问题描述】:

所以我有一种支付分配器,但我正在努力处理浮点运算。我正在使用 currency.js 来处理数学并安装了 jQuery,但可能不会在下面的示例中使用它

我希望有人能够支付一笔金额(比如说 50 美元),然后将该金额分配给列表中的所有项目,然后减去。

假设我有一个价格清单

prices = [12, 8, 25, 14, 12, 20, 0.5, 8] 
grandTotal = sumArray(prices) //Returns 99.50

然后,一位客户想要为该发票申请 50 美元,我想将金额平均分配给所有项目。所以简而言之,我想做 99.5-50 = 49.5

amountToPay = 50

我想要的是输出这样的东西:

/*This sums to 50 and is what need to be subtracted.
In this case I've added the remainder to the last item, but would like the spread to be as even as possible. In currency format, so two decimal places of precision*/
toSubtract = [6, 4, 12.5, 7, 6, 10, 0.25, 4.25]

/*This sums to 49.5, the amount left over when toSubtract is subtracted from prices*/
newPrices = [6, 4, 12.5, 7, 6, 10, 0.25, 3.75] 

但是,是的,真的不知道如何处理分发。我曾尝试通过计算百分比(例如 50/99.5)来实现它,但它非常混乱,并且到处都有精度和舍入误差,我手动捕捉每一个,它只是粗略且难以理解。

【问题讨论】:

  • 是的,我已经或多或少地尝试过使用 foreach。浮点数不会转换为货币,如果我确实使用 currency.js() 这样做,我最终会得到始终关闭的计算。将尝试使用该确切的数据集,看看我之前是否没有犯错。编辑:是的,结果是 49.99,所以我需要在某处添加额外的 .01
  • 是的,或者只需减去价格即可。所以你刚刚给我的同一个基本数组很棒,但我需要把它精确到小数点后两位,即使加起来仍然是 50,这意味着必须分配一些余数,每次我尝试手动更正其余的,它用一组不同的数字打破
  • 例如,如果数组是 [0.333333, 0.333333, 0.333333] 它需要以 [0.34, 0.33, 0.33] 结束
  • 我建议不要使用 JavaScript 对货币做任何事情,除非您首先将所有操作数乘以等于您希望的最大精度的数量级并将它们视为整数。或者使用为这类事情设计的众多库之一。
  • 正如帖子中提到的,我正在使用currency.js 进行操作,它有一个很棒的distribute() 函数,不幸的是在这里无效,但我已经在应用程序的其他部分使用过,并且是我的灵感。为了示例的简单起见,我只是将其省略了。

标签: javascript jquery floating-point currency


【解决方案1】:

根据您的信息,您可以通过简单的数学运算来计算剩余的部分金额。

total = 99.50;
amount = 50.00;
prices = [12, 8, 25, 14, 12, 20, 0.5, 8];
rate = (total - amount) / total;
newPrices = prices.map(e => ((e * rate).toFixed(2)));
["5.97", "3.98", "12.44", "6.96", "5.97", "9.95", "0.25", "3.98"]

【讨论】:

  • 谢谢!但是分布不均匀,尽管在该示例中确实有效。如果您分入金额 = 31.5,则总计将减少 0.01。现在,如果最大误差范围仅为 0.01,那么这并不是一个真正的大问题,因为我可以简单地检查最终输出的总和是否等于预期值,得到差值,然后将其添加到最后一个键中。但是我不确定如何测试它,因为我尝试了几种不同的方法并最终得到了相当大的变化。我早上会玩这个,我不明白为什么它不应该工作,但我很谨慎。
  • 当然会出现一些舍入误差。但我不明白你的意思是它不是均匀分布的。能给我举个例子吗?从给定的数据来看,我的代码和结果看起来完全正确。 example
猜你喜欢
  • 1970-01-01
  • 2014-03-25
  • 2013-12-30
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-23
相关资源
最近更新 更多