重写eval

工作中遇到金额 的计算,计算公式是根据业务需要,从其他系统中传入,如quantity*price或quantity*price2-quantity1*price1,其中quantity由本系统提供,其他参数对本系统来说,是常量。


开始直接使用eval对表达式进行计算,但是由于eval是将表达式中的数值使用浮点型进行计算,会由于精度的问题产生误差。例如eval('8.51*13.5')=114.88499999999999,四舍五入保留两位小数之后,结果为:114.88,会产生0.01的误差。


因此重写eval方法,将表达式中数字提取出来,用Decimal进行转换后在进行计算(本项目中,表达式只涉及加减乘除等基本运算)。代码如下:

import re
from 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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值