工作中遇到金额 的计算,计算公式是根据业务需要,从其他系统中传入,如quantity*price或quantity*price2-quantity1*price1,其中quantity由本系统提供,其他参数对本系统来说,是常量。
开始直接使用eval对表达式进行计算,但是由于eval是将表达式中的数值使用浮点型进行计算,会由于精度的问题产生误差。例如eval('8.51*13.5')=114.88499999999999,四舍五入保留两位小数之后,结果为:114.88,会产生0.01的误差。
因此重写eval方法,将表达式中数字提取出来,用Decimal进行转换后在进行计算(本项目中,表达式只涉及加减乘除等基本运算)。代码如下:
import refrom decimal import Decimal
def cux_eval(expression):
float_list = re.split('[+,\-,*,/,(,)]', expression)
expression_l = ''
for f in float_list:
if f != '':
from_index = expression.index(f)
to_index = from_index + len(f)
expression_f = expression[:from_index]
expression = expression[to_index:]
expression_l += expression_f + "Decimal('" + str(f) + "')"
expression_l += expression
return eval(expression_l)
调用cux_eval('8.51*13.5')
转换后表达式:Decimal('8.51')*Decimal('13.5')
计算结果:Decimal('114.885')
四舍五入保留两位小数:114.89