讨论/算法和数据结构/关于开票尾差拆分凑整的算法问题/
关于开票尾差拆分凑整的算法问题

多个费项合计计算含税价与分别计算含税的合计不一致,存在尾差。

例如:
不含税 税率 含税价
费项1 5133.21 6% 5441.2
费项2 2647976.26 6% 2806854.84
费项3 475247.96 6% 503762.84
费项4 375270.75 6% 397787
费项5 1180985.96 6% 1251845.12
费项6 34190.42 6% 36241.85
费项7 623404.86 6% 660809.15
费项8 121905.77 6% 129220.12
费项9 18500.00 6% 19610
费项10 50859.94 6% 53911.54
合计 5533475.13 5865483.66

用不含税合计计算的含税价位5865483.64.与分项合计存在2分的尾差。

为了减少fp的使用量,求得最小拆分数,并给出各个拆分结果,不含税与含税符合6%的固定税率,且不含税合计要等于a,含税合计要等于b。

该类问题除了暴力拆分,是否有更优、更快的算法?恳请各位大神指教。
(目前暴力拆分只会写固定拆分几次的,如何实现暴力2拆失败尝试暴力3拆、4拆.....)

a = float(input("请输入不含税金额:"))
b = float(input("请输入含税金额:"))
def fpcf(a,b):
    x = 0.01
    y = 0.01
    s = 0
    list2 = []
    while x <= a:
        while y <= a:
            c = round(x,2)
            d = round(x*1.06,2)
            e = round(y,2)
            f = round(e * 1.06, 2)
            g = round(a - x - y,2)
            h = round(g*1.06,2)
            print("这是第{:.2f}-{:.2f}次尝试".format(x,y))
            print()
            y += 0.01
            list1 = []
            if (d+f+h) == b and c > 0 and e > 0 and g > 0:
                print("拆分成功!不含税金额分别为{:.2f}  {:.2f}  {:.2f}".format(c,e,g))
                list1.append(c)
                list1.append(e)
                list1.append(g)
                list2.append(list1)
                return
            else:
                continue
        y = 0.01
        x += 0.01
    if len(list2) >0:
        print("一共有{}个结果!".format(len(list2)))
        for z in list2:
            print(z)
    else:
        print("拆分失败!")

print(fpcf(a,b))
input("Press <enter>")
展开讨论
共 0 个讨论
无讨论