博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
费用分摊问题
阅读量:6148 次
发布时间:2019-06-21

本文共 2416 字,大约阅读时间需要 8 分钟。

原文:

     在现实生活中,我们可能会遇到这样的问题:三个人合伙买一件商品,假如这件商品的价格为1。三个人平摊的费用为1/3,可以用分数表示,但是计算机处理最后的结果是小数0.33(保留两位小数),这样0.33*3=0.99<1,于是就必须有一个人要付0.34。所以在处理费用分摊问题时,并不是每人承担的费用都是总费用*平摊的百分比,对于1/5,2/5,2/5这样的比例算出的结果是没有问题的。总之,要确保分摊的费用之和等于总费用,采取前两个人分别承担的费用=总费用*百分比,最后一个人承担的费用=总费用-(前两个人承担的费用之和)这样的方法就没有问题了。概括的说,前面的费用(除最后一个的费用)都采用总费用*百分比的方法,而最后一个采用(总费用-前面的费用之和)的方法,这样就确保了分摊的费用与总费用没有误差。

      虽然前面的方法是解决了费用分摊的问题,但那方法只是一组费用分摊的问题,但多组费用分摊放到一起的时候,每组的总价不一样,百分比,怎么解决?少量的数据,人的肉眼还可以区分哪些Item是一组,但是大量数据出现时,又怎样处理呢?为了更好理解,我列举数据和编写程式。

No GW TotalGW Fee
1 2.3 2.3  
2 1 3  
2 1.2 3  
2 0.8   3  
3 2.2 2.4  
3 0.2 2.4  
4 3.4 3.4  
5 3.5 3.5  

       首先,我们将数据安照No分组排序;其次,如果按重量分摊的话,多个item分摊的总重TotalGW是不变的,而每组的GW的之和等于每组的TotalGW,这样分摊的百分比就是GW/TotalGW。No号不重复的,费用承担百分比=GW/TotalGW=100%,也就是承担全部费用;最后强调一点,每组的总费用都不相同,但是通过每组的No可以找到对应的总费用,1--->x,2--->y,3--->Z等,同一组的总费用是相同的。

      因为每组的总费用不一样,就要有个标志变量区分组别;总费用变量存对应组的总费用,用于按照百分比*总费用计算分摊费用; 剩余费用变量,用于求分摊组最后一行的费用。

public DataTable Calculate(DataTable dt)        {            string groupNo = "";//组号标志变量            string no;//DataTable中的DataRow的No            decimal totalFee = 0.00m;//总费用            decimal remaining = 0.00m;//剩余费用,用于求一组中最后一行的分摊费用            for (int i = 0; i < dt.Rows.Count; i++)            {                no = dt.Rows[i]["No"].ToString();                               if (groupNo != no)//这一行跟上一行的No进行比较,判断是否是同一组别                {
//不同组的处理办法 if (i != 0) { dt.Rows[i - 1]["Fee"] = remaining + Convert.ToDecimal(dt.Rows[i - 1]["Fee"]);//重新为上一行的fee赋值,因为上一行是上一组的最后一行,分摊 费用=总费用-同组下的前面分摊费用之和 } groupNo = no;//改变标志组号变量,进行下次比较 totalFee = GetTotalFee(no);//获取该组对应的总费用 remaining = totalFee;//初始化剩余费用 } dt.Rows[i]["Fee"] = totalFee * Convert.ToDecimal(dt.Rows[i]["GW"]) / Convert.ToDecimal(dt.Rows[i]["TotalGW"]);//按照百分比*总费用求分摊费用 remaining -= Convert.ToDecimal(dt.Rows[i]["Fee"]);//更新剩余费用 } if(dt.Rows.Count>2) { dt.Rows[dt.Rows.Count-1]["Fee"]=remaining+Convert.ToDecimal(dt.Rows[dt.Rows.Count-1]["Fee"]);//防止最后一行与前一行同组,重新赋值 } return dt; } public decimal GetTotalFee(string no) { return 12.0m; //返回每组对应的总费用 }

  

 

转载地址:http://pxqya.baihongyu.com/

你可能感兴趣的文章
浅谈OSI七层模型
查看>>
Webpack 2 中一些常见的优化措施
查看>>
移动端响应式
查看>>
python实现牛顿法求解求解最小值(包括拟牛顿法)【最优化课程笔记】
查看>>
js中var、let、const的区别
查看>>
腾讯云加入LoRa联盟成为发起成员,加速推动物联网到智联网的进化
查看>>
从Python2到Python3:超百万行代码迁移实践
查看>>
Windows Server已可安装Docker,Azure开始支持Mesosphere
查看>>
简洁优雅地实现夜间模式
查看>>
react学习总结
查看>>
微软正式发布PowerShell Core 6.0
查看>>
Amazon发布新的会话管理器
查看>>
InfoQ趋势报告:DevOps 和云计算
查看>>
舍弃Python,为什么知乎选用Go重构推荐系统?
查看>>
在soapui上踩过的坑
查看>>
MySQL的字符集和字符编码笔记
查看>>
ntpd同步时间
查看>>
must implement java.io.Serializable hessian
查看>>
Microsoft Licenses Flash Lite for Windows Mobile Users
查看>>
HDOJ 2020 绝对值排序
查看>>