从二进制到基48的转换

2024-10-04 01:36:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一个函数,该函数将二进制文件作为字符串,然后将其转换为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。为什么这只发生在这个用例中,而不是其他的呢?我该怎么补救呢


Tags: 文件函数字符串importreturnifdef二进制
1条回答
网友
1楼 · 发布于 2024-10-04 01:36:47

您的问题是浮点不准确。这个数字太大,无法用python浮点表示。int之所以有效,是因为python int是任意精度的

经过几次迭代后,问题会自行修复,因为错误只发生在其余部分,所以除法会隐藏问题

如果在每次迭代中执行print(f"{i/48}, {math.floor(i/48)}, {i//48}"),您将看到问题:

1.2330668424210091e+20, 123306684242100912128, 123306684242100908546
2.568889255043769e+18, 2568889255043768832, 2568889255043769002
5.351852614674518e+16, 53518526146745184, 53518526146745184
1114969294723858.0, 1114969294723858, 1114969294723858
23228526973413.707, 23228526973413, 23228526973413
483927645279.4375, 483927645279, 483927645279
10081825943.3125, 10081825943, 10081825943
210038040.47916666, 210038040, 210038040
4375792.5, 4375792, 4375792
91162.33333333333, 91162, 91162
1899.2083333333333, 1899, 1899
39.5625, 39, 39
0.8125, 0, 0

您可以清楚地看到,在前两行中,值太大,无法放入浮点,从而导致舍入问题

因此,将math.floor(i/48)替换为i//48可以解决这个问题,因为您可以直接计算从任意精度到任意精度的除法,而不必在两者之间强制使用浮点

相关问题 更多 >