通过四舍五入计算折扣而不是给出超过预期的折扣

时间:2012-04-16 15:32:00

标签: c# loops

以下是该方案。

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

让我们假设我的订单有以下情况,作为销售代表,我决定给这位订单的客户提供23.47英镑的折扣。

我有3个订单项,其中两个售价150英镑,另一个售价10.00英镑。订单总价值为310.00英镑

因此,我需要计算每个订单项的折扣百分比(因为,外部界面无法应对订单级折扣,但只能处理订单项折扣)。此外,外部接口只能处理Discount%字段中的一个小数。

逻辑:

  1. 我计算订单的总数(扣除前)。它来到310.00英镑。
  2. 我计算折扣金额占总订单价值的百分比,即23.47英镑/ 310.00英镑
  3. 折扣%为7.570967741935484%。但是,这需要四舍五入到7.6%。如果我这样做,会发生什么是每个订单项的折扣金额更高。每个订单项的折扣金额较高。我最终给出的总折扣是23.56英镑,比我打算给出的0.08英镑,23.47英镑。

    每个订单项应该获得11.36英镑,11.36英镑和0.76英镑的折扣,但我最终得到11.40英镑,11.40英镑和0.76英镑。

    我需要的是弄清楚我在每个订单项的四舍五入中得到的“错误”,并补偿项目中可以应用的最低价格的错误,以便折扣价格为接近我打算给予的(然而,它应该被四舍五入并且永远不会向下舍入)。

    将折扣应用于每个订单项时,是否必须“记住”需要应用的剩余折扣金额?

    伪代码如下。

    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 :-)
    

    这样做的最佳方式是什么?

    PS:不确定是否需要在这里。但是,如果不适用于SE网站,请随意指出正确的方向或删除它。

2 个答案:

答案 0 :(得分:0)

不要舍入到7.6%,使用完整的7.570967741935484%计算每件商品的确切(ish)折扣。

这会给你一个小数结果。必要时进行舍入,但无论哪种方法都可以解决您的小数误差。

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

重复。

答案 1 :(得分:0)

如果你被限制在不超过1位小数的折扣百分比,我恐怕不可能实现。

想象一下以下输入:您只卖一件物品,价格为1000英镑,而您希望给予1p折扣。因此,要么给予0.1%的折扣(导致整个1英镑),要么给予0%(完全没有折扣)。

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

所以,有时你无法获得你真正想要的折扣金额 - 在这种情况下可以做些什么?

一种简单的方法是尝试不同折扣的组合。显然,你可以出售P(其正常价格),999/1000 * P,998/1000 * P,... 0/1000 * P的每个项目。所以,你可以尝试找到每个项目的系数,使总金额尽可能接近所需金额。如果购买中的商品数量很大,那么这个简单的想法会很慢。

(旁注:如果我们不受限制只有正折扣,我们实际上可以做以下诀窍:找到所有商品价格的最大公约数,并且拥有它,我们可以很容易地用GCD / 1000的精度。)

关于负面折扣的说明:假设您允许也提供负面折扣。例如,您可以给出-1%的折扣,从而导致客户为该项目支付1%更多。这样您就可以获得更准确的近似值。示例:如果您有2件物品,分别花费1000英镑和990英镑,并且您希望给出1p的总折扣:您可以通过给予第一项的0.1%和-0.1%的折扣来实现这一目的。第二项,因此第一项客户支付1000英镑* 99.9%= 999英镑,第二项支付990英镑* 100.1%= 990.99英镑。总共它是1989.99英镑,这与1990年的英镑相差一点。你知道,只有正折扣才能实现这样的精确度吗?