思路:把需要计算的数字升级(乘以10的n次幂)成计算机能够精确识别的整数,等计算完成后再进行降级(除以10的n次幂)
代码如下:
# 浮点数运算转换为整数运算避免精度损失
def float_to_int(x):
res = {'times':0,'num':0}
if isinstance(x,int):
res['num'] = x
elif isinstance(x,float):
idx = str(x).index('.')
res['times'] = len(str(x))-idx -1
res['num'] = int(str(x).replace('.',''))
return res
#乘法运算
def mul(a,b):
a,b = float_to_int(a),float_to_int(b)
return a['num']*b['num']/(10**a['times']*10**b['times'])
#除法运算
def divide(a,b):
a,b = float_to_int(a),float_to_int(b)
return mul(a['num']/b['num'],(10**b['times']/10**a['times']))
#加法运算
def add(a,b):
a,b = float_to_int(a),float_to_int(b)
if a['times'] < b['times']:
times = b['times'] - a['times']
return (a['num']*(10**times) + b['num'])/10**b['times']
elif a['times'] > b['times']:
times = a['times'] - b['times']
return (b['num']*(10**times) + a['num'])/10**a['times']
else:
return (a['num']+ b['num'])/10**b['times']
#减法运算
def substract(a,b):
a,b = float_to_int(a),float_to_int(b)
if a['times'] < b['times']:
times = b['times'] - a['times']
return (a['num']*(10**times) - b['num'])/10**b['times']
elif a['times'] > b['times']:
times = a['times'] - b['times']
return (b['num']*(10**times) - a['num'])/10**a['times']
else:
return (a['num']- b['num'])/10**b['times']