【问题标题】:Determining an algorithm to calculate individual item prices for "deal" listings确定一种算法来计算“交易”列表的单个项目价格
【发布时间】:2015-03-04 22:54:12
【问题描述】:

以下是一些关于我想要弄清楚的示例场景:

假设杂货店商品列为4 for 5.00。根据列出的交易,我们如何计算每件商品的单价?

一个简单的解决方案是将总价格除以列出的数量,在这种情况下,您将得到1.25

但是,在更复杂一点的情况下,例如3 for 5.00,将价格除以数量大致得出1.6666666666666667,然后四舍五入为1.67

如果我们将所有三个项目四舍五入到1.67,总价格不是5.00,而是实际上5.01。各个价格需要计算为1.671.671.66 才能正确相加。

3 for 4.00 之类的内容也是如此。数学单价为1.3333333333333333,四舍五入为1.33。但是,我们需要再次调整其中一个,因为未经调整的实际价格将是3.99。各个价格需要为1.341.331.33 才能正确加起来。

是否有一种有效的方法来确定如何拆分这样的价格交易,以及如何确定调整后的金额,以使各个价格正确相加?

【问题讨论】:

    标签: algorithm


    【解决方案1】:

    由于我们在这里讨论的是基本数学,我想说效率更多地取决于您的实现而不是算法。当您说“高效”时,您的意思是您不想将所有价格相加来检查余数吗?可以这样做:

    前提是,您以 y 的价格出售 x 件商品,其中 x 显然是整数,y 显然是四舍五入到小数点后 2 位的浮点数。

    首先,您需要计算余数:R = (y*100)%x。 项目的 x-R 将花费(y * 100 : x) /100(其中“:”表示整数除法,“/”表示浮点除法) 和 R 的项目将花费 (y * 100 : x) / 100 + 0.01

    该算法理论上是有效的,因为它的复杂度为 O(1)。但我想我记得在硬件中没有什么比添加浮点数更有效(不要相信我的话,我没有太关注我的硬件讲座),所以也许粗略的方法仍然更好。

    【讨论】:

      【解决方案2】:

      如果您想将整数(例如便士)分成尽可能相等的部分,一种方法是通过在其中做标记来模拟分割线的该部分,因此 n 的部分 i(从 0 开始计数) ) 当总数为 T 时,其长度为 floor((T * (i + 1)) / n) - floor((T * i) / n)。

      说 3 件商品的单价分别为 1.67、1.67 和 1.66 是否有意义是另一回事。你如何决定哪一件是便宜的?

      【讨论】:

      • 有趣,感谢您的回复。关于决定哪个是便宜的,这来自杂货店的收银员。我刚刚注意到我们的 POS 系统就是这样做的,我认为最便宜的商品总是最后添加。或者,在 3/4.00 之类的情况下,首先添加最昂贵的 (1.34)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2021-07-24
      相关资源
      最近更新 更多