设计中产生的一个数学问题

背景:将一批商品进行入库操作。
情况一 商品A,金额(6.50),数量(2)=> 此时的单价(3.25)是在分数位(小数点后2位)以内是可以除尽的。
情况二 商品B,金额(6.85),数量(3)=> 此时的单价(2.283333…),除不尽。

而实际支付中,我们只能支付到几元几角几分钱,分位后面的是无法进行支付的。所以产生了一种处理方法(不是四舍五入)。那就是如果某种商品的某批进货的金额÷数量得出的结果在小数点后2位数以内仍然除不尽的话,就必须将这批进货的入库操作进行拆分。

比如将情况二中的入库可以拆分成2批进货:
①商品B,金额(4.56),数量(2)=> 单价(2.28)
②商品B,金额(2.29),数量(1)=> 单价(2.29)

①的金额+②的金额=6.85,仍然等于拆分前的总金额,而数量也是相加也仍然等于拆分前的总数量。但此时实际支付的时候,用户却可以准确的,不用四舍五入的,支付出他所需要支付的金额数。因为此时的单价是个可以支付的数目。

问题就是,【从编程的角度,如果设计一种算法】,使得不管这批进货的商品的金额与数量之间的关系是如何,都能将这批货物合理地逻辑划分(如果它需要划分的话)为2批货物(实在不行可以划分为3批、4批),确保划分完的这些货物的单价是只精确到分位以内的。
同时此时各批的单价×各批的数量,然后相加的和,仍然等于拆分前的总金额;各批的数量相加之和,也仍然等于拆分前的总数量。
最后注意一点是,拆分完的各批单价不能相差太多,应该只是分位上有差异。
就是想询问下大家,如何设计这个算法。。。

首先我认为在实际中没必要这样做。
不过你非要做的话,按如此计算

1:计算精确值,并取整(取整到分)
6.85/3=2.28(3333)

2:必定分两批,两批的价格分别是取整金额,和+1分
2.28 2.29

3:计算有多少是小的金额,多少是大的金额
6.85-(2.28×3)=0.01
就是少了一分钱,自然需要将一件提升1分

4:即2.29的1件 2.28的(3-1)=2件
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-09-17
看懂了你的问题,遗憾的是我却不会编程。

试着描述一下你的问题:
总金额X,数量n

1)若100X/n-[100X/n]=0([]表示取整函数)
无需划分
2)若100X/n-[100X/n]≠0
设100X mod n =a(100x除以n的余数是a)
则分成两批为:
a个价格:[100X/n]+1
n-a个价格:[100X/n]
以上价格单位均为分。

按照以上拆分,无论总金额和总数量是多少,均可分成两批,并且拆分后,均可满足两批单价仅相差1分。
只是这样拆分后,两批的数量可能会相差较大,但你的设计中并未要求两批数量也要相近,只是要求单价相近。
第2个回答  2009-09-17
设总金额A,总数量Q,平均单价P
所以:P=A/Q
我们来讨论P的小数部分存在“小于分”的情况
即:100P的整数部分-100P<0 的情况
在此情况下,
设Z=100P的整数部分
P1=Z/100, P2=P1+0.01
设P1,P2对应的数量分别为:q1,q2
则:q1+q2=Q
A=P1*q1+P2*q2=P1*q1+(P1+0.01)*q2
=P1*(q1+q2)+0.01*q2
=P1*Q+0.01*q2
q2=(A-P1*Q)*100
q1=Q-q2

下面来说说编程步骤:
(1)求P=A/Q,求100P,再求100P,判断100P是否是整数,如果是,则不用拆分。
如果不是,则:取100P的整数部分,记为Z (通常:"判断是否是整数"及"取整数部分"都有现有公式可用)
(2)求P1=Z/100, 求P2=P1+0.01
(3)求q2=(A-P1*Q)*100, 求q1=Q-q2
(4)输出P1,q1,P2,q2
第3个回答  2009-09-17
将分值后面的循环小数转换成分数。

比如将情况二中的入库可以拆分成2批进货:
①商品B,金额(4.56),数量(2)=> 单价(2.28)
②商品B,金额(2.29),数量(1)=> 单价(2.29)

数量(3)=> 此时的单价(2.283333…)
2.28333……=2.28+0.0033……=2.28+1/300
总金额=3×2.2833……
=3×(2.28+1/300)
=3×2.28+1/100
1/100=0.01----1分钱,所以可拆分成上面的①、② 。

例如:总金额(21.11),数量(9),单价(2.3455……)
2.3455……=2.34+0.0055……=2.34+1/180
总金额=9×2.3455……
=9×(2.34+1/180)
=9×2.34+1/20
1/20=0.05,
可拆分成-----①数量(8),单价(2.34)
②数量(1),单价(2.39)
或将0.05拆分成0.01+0.01+0.01+0.01+0.01
可拆分成----①数量(4),单价(2.34)
②数量(1),单价(2.35)
③数量(1),单价(2.35)
④数量(1),单价(2.35)
⑤数量(1),单价(2.35)
⑥数量(1),单价(2.35)
第4个回答  2009-09-17
可以和银行结算采用同样的原理
设1分为最小单位,并显示到分位结束,所有余数寄存于一个变量内。
如果一旦寄存器内的变量超过了一分整数,则自动对显示数字进行+1分操作,将变量内的1分整数自动减去,分位后的小数仍在寄存在变量内。
算法简单,而且绝不出错。
第5个回答  2009-09-16
耐心地看了你的问题:
你什么都懂,还自己列了算式,也按你自己的理解该怎样处理,你需要弄懂的细节还是没阐明清楚,你要大家怎样回答你的问题?你比回答问题的还清楚是怎么回事。
你是大家的老师......
相似回答