Python处理浮点数精度存在的问题
以及Python十进制二进制相互之间的转换
def zbinary(num):
#判断是否为整数
if num == int(num):
integer = '{:b}'.format(int(num)) #将十进制整数转换为二进制数
return num
else:
integer_part = int(num) #取十进制浮点数的整数部分
decimal_part = num - integer_part #取十进制浮点数的小数部分
integer_partcom = '{:b}'.format(integer_part) #利用format将十进制数整数转换为二进制数
#小数部分转化为二进制
f = decimal_part
fbb = [] #存小数部分二进制数
A = True #用于循环
while A:
f = f * 2 #小数变二进制数是乘以2,整数是辗转相除法
fbb += str(int(f)) #逢1进1,0不进。!!!这里有一个问题+=与 = +有问题
if f > 1:
f = f - int(f) #减1取小数部分继续
elif f < 1:
pass
else:
break
flocom = fbb
return integer_partcom + '.' + ''.join(flocom) #将二进制的字符串拼接在一起
def zdecimal(n):
#将二进制小数转换为十进制浮点数
# number1 表示二进制数,number2表示十进制数
string_number1=str(n)
decimal = 0 # 小数部分化成二进制后的值
flag = False
for i in string_number1: # 判断是否含小数部分
if i == '.':
flag = True
break
if flag: # 若二进制数含有小数部分
string_integer, string_decimal = string_number1.split('.') # 分离整数部分和小数部分
for i in range(len(string_decimal)):
decimal += 2 ** (-i - 1) * int(string_decimal[i]) # 小数部分化成二进制
number2 = int(str(int(string_integer, 2))) + decimal
return round(number2, 4)
else: # 若二进制数只有整数部分
return int(string_number1, 2) # 若只有整数部分
if __name__ == '__main__':
a = 0.55
b = 0.3
result1 = zbinary(a)
result2 = zbinary(b)
result = result1 + result2
print(result1)
print(result2)
#print(result1+result2)
to1 = zdecimal(result1)
to2 = zdecimal(result2)
print(to1)
print(to2)
print(to1+to2)
#print(float(result1,base=10))
测试结果