我创建了一个函数,该函数将二进制文件作为字符串,然后将其转换为base48,它适用于大多数测试用例,但当我通过它运行“101000000110110101100000000000100010111110100001011010101100000011011010”时
import math
def Binary2Octoquadragesimal(n):
octdict = {"0":"0","1":"1","2":"2","3":"3","4":"4","5":"5","6":"6","7":"7","8":"8","9":"9","10":"a","11":"b","12":"c","13":"d","14":"e","15":"f","16":"g","17":"h","18":"i","19":"j","20":"k","21":"l","22":"m","23":"n","24":"o","25":"p","26":"q","27":"r","28":"s","29":"t","30":"u","31":"v","32":"w","33":"x","34":"y","35":"z","36":"A","37":"B","38":"C","39":"D","40":"E","41":"F","42":"G","43":"H","44":"I","45":"J","46":"K","47":"L",}
ans = []
if n == "":
return ""
i = int(n,2)
if i == 0:
return "0"
while i > 0:
ans.append(octdict[str(i%48)])
i = math.floor(i/48)
ans.reverse()
print (ans)
return ("".join(ans))
它返回了错误的值,我查看了一下我的代码,在这个特定的测试用例中,我的函数返回Dragonfly00w6而不是Dragonfly2026。为什么这只发生在这个用例中,而不是其他的呢?我该怎么补救呢
您的问题是浮点不准确。这个数字太大,无法用python浮点表示。int之所以有效,是因为python int是任意精度的
经过几次迭代后,问题会自行修复,因为错误只发生在其余部分,所以除法会隐藏问题
如果在每次迭代中执行
print(f"{i/48}, {math.floor(i/48)}, {i//48}")
,您将看到问题:您可以清楚地看到,在前两行中,值太大,无法放入浮点,从而导致舍入问题
因此,将
math.floor(i/48)
替换为i//48
可以解决这个问题,因为您可以直接计算从任意精度到任意精度的除法,而不必在两者之间强制使用浮点相关问题 更多 >
编程相关推荐