2

这是场景。

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

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

我有 3 个订单项,其中两个花费 150.00 英镑,一个花费 10.00 英镑。订单总价值为 310.00 英镑

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

逻辑:

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

折扣百分比为 7.570967741935484%。但是,这需要四舍五入到 7.6%。如果我这样做了,那么每个行项目的折扣金额会更高。每个行项目的折扣金额较高。我最终给予的总折扣是 23.56 英镑,比我打算给予的 23.47 英镑多 0.08 英镑。

每个订单项应获得 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 网站,请随时指出我正确的方向或将其删除。

4

3 回答 3

0

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

这会给你一个分数结果。如有必要,请四舍五入,但无论哪种方式都可以解决您的小数误差。

在您的下一项上,在决定如何四舍五入之前添加上一项的错误。

重复。

于 2012-04-16T15:42:28.113 回答
0

如果您被限制在不超过小数点 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%。通过这种方式,您可以获得更准确的近似值。示例:如果您有 2 件商品,价格分别为 1000 英镑和 990 英镑,并且您想提供 1 便士的总折扣:您可以通过为第一个商品提供 0.1% 的折扣和为第一个商品提供 -0.1% 的折扣来实现此目的第二项,因此客户为第一项支付 1000 英镑 * 99.9% = 999 英镑,为第二项支付 990 英镑 * 100.1% = 990.99 英镑。总共是 1989.99 英镑,比 1990 英镑便宜 1 便士。仅仅通过积极的折扣是无法达到如此精确的,你明白吗?

于 2012-04-16T15:42:55.217 回答
0

如果您对每一行应用折扣百分比,则由于四舍五入,您无法将相同的折扣百分比应用于总价并获得相同的答案。您需要将每行的折扣价格相加才能得出总数。

我已经在许多系统上多次看到这种情况,只有一种方法可以让它工作。每条线都有正确的价格/价值,所以你需要总结它们。

于 2021-09-13T16:16:46.233 回答