Как исправить код для кодировки base62 с помощью Python3? - PullRequest
0 голосов
/ 08 октября 2019

Я создаю скрипт на python для кодировки base62. Однако по какой-то причине мой код не дает правильного ответа. Правильный ответ - LpuPe81bc2w, но я получаю LpuPe81bc0w. Если вы можете просмотреть мой код и посмотреть, могу ли я сделать что-то другое. Пожалуйста, дайте мне знать. Я не могу использовать pybase62.

Я действительно хочу знать, почему мой код не работает, потому что я хочу понять основы. Предпочтительно

НЕТ PyBASE62 и я новичок.

base_62 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
BASE = len(base_62)

def to_base_62(number):  
 rete=''
 while number != 0:    
  rete = (base_62[number%BASE])+rete  
  number = int(number/BASE)
 return rete

print (to_base_62(18327995462734721974))

1 Ответ

0 голосов
/ 08 октября 2019

Вы столкнулись с точностью с плавающей точкой. Я вставил в ваш код простую инструкцию отслеживания:

def to_base_62(number):  
    rete=''
    while number != 0: 
        rete = base_62[number%BASE]+rete    
        print(len(rete), number/BASE)
        number = int(number/BASE)
    return rete

Вывод:

1 2.956128300441084e+17
2 4767948871679168.0
3 76902401156115.61
4 1240361308969.5967
5 20005827564.01613
6 322674638.12903225
7 5204429.645161291
8 83942.40322580645
9 1353.9032258064517
10 21.822580645161292
11 0.3387096774193548
LpuPe81bc0w

Деление с плавающей запятой не содержит достаточно цифр, чтобы выделить те, которые вам нужны для числаэто большое. Вместо этого используйте целочисленное деление:

while number != 0: 
    rete = base_62[number%BASE]+rete    
    print(len(rete), number // BASE)
    number = number // BASE

Вывод:

1 295612830044108418
2 4767948871679168
3 76902401156115
4 1240361308969
5 20005827564
6 322674638
7 5204429
8 83942
9 1353
10 21
11 0
LpuPe81bc2w
...