业务背景

在实际工作中,经常会遇到计算合同金额、合同价款、合同税款的情况,公式如下:

合同金额 = 合同价款 + 合同税款

合同税款 = 合同价款 * 合同税率

合同金额 = 合同价款 + 合同价款 * 合同税率 = 合同价款 * (1 + 合同税率)

如果已知合同金额和合同税率,那么

合同价款 = 合同金额 / (1 + 合同税率)

上述逻辑适用于合同税率单一的情况,实操中,一个合同往往还包括产品费用和实施费用,而二者的增值税率不一样,前者为13%,后者为6%,那么价款和税款又可以分为产品价款、产品税款、实施价款、实施税款这四类。

作为IT从业人员,无论您是甲方项目经理,还是乙方项目经理、销售经理、商务经理,计算上面的数字是经常的事情。人工计算难免出错,也不利于核验,会说科技根据以上逻辑编写完成如下价款和税款Python代码一段,送给需要的呢。

#python#

Python代码

实操中,对金额往往只需保留两位小数,因此首先写一个四舍五入并且保留两位小数的函数,定义为round_up。为什么要重新定义呢,因为Python原生的round对于精细化的四舍五入无法做到精准,往往会错位,具体您可以试一下。

def round_up(value):    # 替换内置round函数,实现保留2位小数的精确四舍五入    return round(value * 100) / 100.0

下面定义本文的核心函数,即价款、税款计算函数,传入参数为产品金额、产品税率、实施金额、实施税率,返回报错信息、产品价款、产品税款、实施价款、实施税款。

#正则表达式#

#计算价款和税额import re#productMoney:产品金额#productRate:产品税率#modelMoney:实施金额#modelRate:实施税率def tax_compute(productMoney,productRate,modelMoney,modelRate):    errmsg = ''    productAmt = 0 #产品价款    productTax = 0 #产品税款    modelAmt = 0 #实施价款    modelTax = 0 #实施税款        #将参数转成字符串,以便应用正则表达式匹配    #不做转换,re无法识别    productMoneyStr = str(productMoney)     productRateStr = str(productRate)    modelMoneyStr = str(modelMoney)    modelRateStr = str(modelRate)        #正则表达式,匹配金额0.00-999999999.999999    moneyPattern = r'([1-9]d{0,9}|0)(.d{1,6})'         #如果参数输入不合法则报错返回    if re.match(moneyPattern,productMoneyStr) == False or re.match(moneyPattern,productRateStr) == False:        errmsg = '产品金额或税率不正确'        return errmsg,productAmt,productTax,modelAmt,modelTax        if re.match(moneyPattern,modelMoneyStr) == False or re.match(moneyPattern,modelRateStr) == False:        errmsg = '实施金额或税率不正确'        return errmsg,productAmt,productTax,modelAmt,modelTax        if productMoney < 0:        errmsg = '产品金额不正确'        return errmsg,productAmt,productTax,modelAmt,modelTax        if productRate < 0 or productRate > 1:        errmsg = '产品税率不正确'        return errmsg,productAmt,productTax,modelAmt,modelTax        if modelMoney < 0:        errmsg = '实施金额不正确'        return errmsg,productAmt,productTax,modelAmt,modelTax        if modelRate < 0 or modelRate > 1:        errmsg = '产品税率不正确'        return errmsg,productAmt,productTax,modelAmt,modelTax        #合同价款    productAmt = productMoney/(1+productRate)     #合同税款    #中间一定要有操作符,不然报'float' object is not callable的错误    productTax = productAmt * productRate    #校验合同价款、税款、金额    checkProductMoney = productAmt+productTax    #实施价款    modelAmt = modelMoney / (1+modelRate)    #实施税款    modelTax = modelAmt * modelRate    #校验实施价款、税款、金额    checkModelMoney = modelAmt + modelTax    #校验通过    #结果校验未通过,请联系管理员12345678【600000.0000000001=600000.0,1216000.0=1216000.0    #直接用==会出现同一个数字因为精度不同导致的不一致,因此改用abs    if abs(checkProductMoney - productMoney) < 0.00001 and abs(checkModelMoney - modelMoney) < 0.00001:        errmsg = '校验通过,结果如下:'        return errmsg,round_up(productAmt),round_up(productTax),round_up(modelAmt),round_up(modelTax)    else:        errmsg = '结果校验未通过:【'+str(checkProductMoney)+'='+str(productMoney)+','+str(checkModelMoney)+'='+str(modelMoney)        return errmsg,round_up(productAmt),round_up(productTax),round_up(modelAmt),round_up(modelTax)

有了上面的核心函数,我们下面验证一下,与通过计算器计算的结果一致。#Python函数#

errmsg,productAmt,productTax,modelAmt,modelTax = tax_compute(800000.00,0.13,1200000.00,0.06)if(errmsg == ''):    print('产品价款:',productAmt)    print('产品税额:',productTax)    print('产品金额:',productAmt+productTax)    print('实施价款:',modelAmt)    print('实施税额:',modelTax)    print('实施金额:',modelAmt+modelTax)else:    print(errmsg)    print('产品价款:',productAmt)    print('产品税额:',productTax)    print('产品金额:',productAmt+productTax)    print('实施价款:',modelAmt)    print('实施税额:',modelTax)    print('实施金额:',modelAmt+modelTax)#结果为校验通过,结果如下:产品价款: 707964.6产品税额: 92035.4产品金额: 800000.0实施价款: 1132075.47实施税额: 67924.53实施金额: 1200000.0