通过四舍五入计算折扣,并且不提供超出预期的折扣

  • 本文关键字:四舍五入 计算 c# loops
  • 更新时间 :
  • 英文 :


这是一个场景。

我正在编写应用折扣的代码,我遇到了各种各样的麻烦。

让我们假设我的订单有以下内容,作为销售代表,我决定为该订单给客户23.47英镑的折扣。

我有3行商品,其中两个售价150.00英镑,一个售价10.00英镑。订单总价值为310.00英镑

因此,我需要计算每个行项目的%折扣(因为,外部接口无法处理订单级别的折扣,而只能处理行项目的折扣)。此外,外部接口只能处理Discount%字段中的一个小数。

逻辑:

  1. 我计算订单的总额(折扣前)。一共310.00英镑
  2. 我计算出折扣金额占订单总价值的百分比,即23.47/310.00英镑

折扣%计算为7.5709677419345484%。然而,这需要四舍五入到7.6%。如果我这样做,会发生的情况是每个行项目的折扣金额都更高。每个行项目的折扣金额较高。我最终提供的总折扣为23.56英镑,比我打算提供的23.47英镑多0.08英镑。

每个商品都应该有11.36英镑、11.36英镑和0.76英镑的折扣,但我最终给出了11.40英镑、11.40英镑和0.77英镑。

我需要的是计算出我在每一行项目的四舍五入中得到的"错误",并补偿可以应用的价格最低的项目中的错误,以便折扣价格尽可能接近我想要给出的价格(然而,它应该向上取整,永远不要向下取整)。

当对每个行项目应用折扣时,我是否必须"记住"需要应用的剩余折扣金额?

伪代码如下。

iterating through each line item
//first line item where I have given more discount than intended. 4p more. So, the remaining discount is not £12.11 but actually £12.07
//Calculate the discount% for remaining line items, i.e., 
//And, I am confused :-)

做这件事最好的方法是什么?

附言:不确定这个是否需要在这里。但如果不适用于SE网站,请随时为我指明正确的方向或删除它。

不要四舍五入到7.6%,使用完整的7.57096771935484%计算出每个项目的确切(ish)折扣。

这将给你一个分数结果。如有必要,请四舍五入,但无论哪种方法都可以计算出分数误差。

在您的下一个项目中,添加上一个项目的错误,然后再决定如何舍入。

重复。

如果您被限制在小数点后不超过1位的折扣百分比,恐怕这并不总是可能实现的。

想象一下以下输入:你只卖一件商品,价格为1000英镑,你想给1便士的折扣。因此,要么你给0.1%的折扣(得到整个1英镑),要么给0%的折扣(根本没有折扣)。

事实上,你可能给出的折扣可以用最小商品价格的1/1000表示(从1到1000),可能会从第二小的商品价格中增加折扣等。

所以,有时你无法获得你真正想要的折扣——在这种情况下该怎么办?

一个简单的方法是尝试不同折扣的组合。显然,你可以以P(正常价格)、999/1000*P、998/1000*P、。。。0/1000*P。因此,您可以尝试为每个项目找到一个系数,这使总额尽可能接近所需的总和。不幸的是,如果购买的商品数量很大,这个简单的想法会太慢。

(顺便说一句:如果我们不局限于只有正折扣,我们实际上可以做以下技巧:找到所有商品价格的最大公约数,有了它,我们可以很容易地以GCD/1000的精度弥补任何价格。)

关于负折扣的注意事项:假设允许也提供负折扣。例如,您可以给予-1%的折扣,导致客户为该商品多支付1%。这样可以实现更精确的近似。示例:如果你有两件商品,分别花费1000英镑和990英镑,并且你想给1便士的总折扣:你可以通过给第一件商品0.1%的折扣和给第二件商品-0.1%的折扣来实现这一点,所以客户为第一件商品支付1000英镑*99.9%=999英镑,为第二件物品支付990英镑*100.1%=990.99英镑。总共是1989.99英镑,与1990英镑相比正好有1便士的折扣。一个人不可能实现这样的精度,只有积极的折扣,你明白吗?

如果对每一行应用折扣百分比,则由于舍入,无法对总价应用相同的折扣百分比并得到相同的答案。你需要把每一行的折扣价加起来才能得到总数。

我已经在许多系统上看到过很多次这样做,只有一种方法可以让它发挥作用。每一行都有正确的价格/价值,所以你需要把它们加起来。