【发布时间】:2012-07-23 11:56:21
【问题描述】:
使用 PHP 编码并带有 MySQL 数据库的 Web 应用程序。
我有一个系统,可以在分摊成本时计算多人的不同成本。例如,A 人以 10 元的价格买东西,B、C 和 D 应该分摊费用。
因此,系统应为人员 A 记录 10 个积极记录,为 B、C 和 D 记录 10/3 的消极记录。
但是,当这完成时; B、C 和 D 四舍五入后均为 -3.33。当然,哪一个不加起来到 10 个总数中。解决这个问题的最佳方法是什么?最佳解决方案也会随机化人们得到的东西,即稍微大一点的成本。
一种可能的解决方案是,如果我让最后一个人的债务为10 - (A + B),但如果四个人 分摊成本,例如 13.34,就会出现问题。不同的部分将是 3.34、3.34、3.34 和 3.32,而最佳分割将是 3.34、3.34、3.33、3.33。
有些人可能会争辩说,足够的小数只有在有大量行时才会出现问题。但在一个经济的系统中,我认为从一开始就拥有一个故障安全系统是很重要的。它需要可扩展,不能有丝毫错误。 不公平没关系,只是没有错误。
类似问题:sum divided values problem (dealing with rounding error)
【问题讨论】:
-
" 不公平是可以的,只是没有错误。" - 喜欢它
-
我想我会找到两个最接近的分割值,然后在分配它们时在两者之间切换。然后弄清楚如何处理(潜在的)最后一个奇数值。
-
这就是每个问题的外观:)。很好的描述。来自我的 +1。
-
在涉及金钱的情况下,我认为公平最终总是很重要——如果您的系统一直对某一类用户收取过高的费用(例如基于 ID 号、注册日期、按字母顺序排列的姓名,或者您的数据库)排序记录),有一些集体诉讼的可能性。一种公平的方法是,每次计算收费金额时,从尚未收费的用户列表中随机选择一个用户进行收费。
标签: php divide rounding-error