Преобразование чисел в десятичную систему с помощью Python
Основной способ: встроенная функция int()
Для перевода числа из любой позиционной системы счисления в десятичную в Python применяется функция int() с указанием второго аргумента - основания системы. Этот метод самый простой и эффективный благодаря встроенной реализации на C.
# Перевод из двоичной системы
binary = '1011'
decimal = int(binary, 2)
print(decimal) # 11
# Перевод из восьмеричной
octal = '77'
decimal = int(octal, 8)
print(decimal) # 63
# Перевод из шестнадцатеричной
hex_val = '1A'
decimal = int(hex_val, 16)
print(decimal) # 26Python восьмеричная система (восьмеричная система счисления в python)
11 63 26
перевод в другие системы счисления python (перевод в другую систему счисления в python)
Возможные ошибки:
- ValueError при недопустимых символах в строке (например, '1G' для основания 16).
- ValueError при указании основания меньше 2 или больше 36.
- TypeError если первый аргумент не строка, а число (число уже десятичное).
Решение: перед вызовом int() валидировать строку регулярным выражением или оборачивать вызов в try-except.
Случаи использования: быстрый перевод целых чисел, работа с данными из файлов или ввода пользователя, парсинг конфигураций.
Как выполнить перевод вручную, без int(), для лучшего понимания алгоритма?
Вариант 1: алгоритм умножения на основание (метод Горнера)
Идея: пройти по символам строки слева направо, накапливая результат умножением текущего значения на основание и добавлением цифры.
def bin_to_dec(bin_str):
result = 0
for digit in bin_str:
result = result * 2 + int(digit)
return result
print(bin_to_dec('1101')) # 1316 система счисления python (перевод в шестнадцатеричную систему в python)
13
Python перевод в двоичную систему (перевод числа в двоичную систему в python)
Этот вариант работает для любой системы, если заменить основание 2 на нужное и преобразовывать символы 'A'-'F' в числа 10-15.
def any_base_to_dec(s, base):
digits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
result = 0
for ch in s.upper():
value = digits.find(ch)
if value == -1 or value >= base:
raise ValueError('Недопустимый символ')
result = result * base + value
return result
print(any_base_to_dec('FF', 16)) # 255
print(any_base_to_dec('777', 8)) # 511перевод в десятичную систему счисления python (перевод числа в десятичную систему счисления в python)
255 511
перевод в троичную систему python (перевод числа в троичную систему в python)
Типичные проблемы:
- Использование символов нижнего регистра - функция .upper() решает.
- Игнорирование лишних пробелов - нужно предварительно очистить строку.
- Ошибки с негативными числами - требуется отдельная обработка знака.
Как перевести число с плавающей точкой из другой системы?
Вариант 2: перевод дробной части
Для перевода дробной части из системы с основанием B в десятичную применяется деление: каждый разряд после точки умножается на B(-k), где k - позиция.
def bin_frac_to_dec(s):
if '.' not in s:
return int(s, 2)
int_part, frac_part = s.split('.')
result = int(int_part, 2) if int_part else 0
for k, digit in enumerate(frac_part, start=1):
result += int(digit) * (2 ** -k)
return result
print(bin_frac_to_dec('101.101')) # 5.625
print(bin_frac_to_dec('1101.001')) # 13.125функция перевода систем счисления python (функция перевода в любую систему счисления в python)
5.625 13.125
Ошибки при реализации:
- Потеря точности из-за двоичной арифметики - результат может быть не точным десятичным представлением.
- Отсутствие обработки дробных чисел с повторяющимися десятичными знаками.
Как обработать пользовательский ввод и избавиться от посторонних символов?
Вариант 3: с очисткой строки и проверкой
def safe_convert_to_dec(s, base):
import re
s = s.strip().removeprefix('0b').removeprefix('0o').removeprefix('0x')
s = s.replace(' ', '')
if not s:
return None
try:
return int(s, base)
except ValueError:
return None
# Примеры
print(safe_convert_to_dec('0b1010', 2)) # 10
print(safe_convert_to_dec(' FF ', 16)) # 255
print(safe_convert_to_dec('123G', 10)) # None10 255 None
Частая ошибка: пользователь вводит префиксы '0b', '0x' - их нужно удалять перед int, иначе основание будет игнорироваться.
Расширенные примеры перевода в десятичную систему
Ниже представлены более сложные случаи, которые могут возникнуть на практике.
Пример 1: перевод числа из системы с основанием 36
Система до 36 использует цифры 0-9 и буквы A-Z. Функция int() поддерживает такие основания:
# Представление числа 'HELLO' в 36-ричной системе (условно)
s = 'HELLO'
value = int(s, 36)
print(f'Число {s} в 36-ричной = {value} в десятичной')
# Распечатаем обратно для проверки
import numpy as np
# (альтернативно можно использовать встроенную функцию)Число HELLO в 36-ричной = 530431702 в десятичной
Обратный перевод можно выполнить с помощью цикла деления.
Пример 2: перевод больших чисел (до 1024 бит)
Python автоматически обрабатывает произвольную точность целых чисел. int() корректно работает для строк длиной сотни символов:
big_bin = '1' + '0' * 1000 # единица и 1000 нулей (2^1000)
decimal_val = int(big_bin, 2)
# результат будет огромным числом из 302 десятичных цифр
print(f'Длина десятичного числа: {len(str(decimal_val))}')Длина десятичного числа: 302
Пример 3: перевод чисел с ведущими нулями и знаками
int() игнорирует ведущие нули, но не принимает знак минус в строке. Нужно обрабатывать отдельно:
def signed_convert(s, base):
if s.startswith('-'):
return -int(s[1:], base)
elif s.startswith('+'):
return int(s[1:], base)
else:
return int(s, base)
print(signed_convert('-1111', 2)) # -15
print(signed_convert('+1A', 16)) # 26-15 26
Пример 4: реализация перевода через сумму степеней (без метода Горнера)
Менее эффективный, но наглядный способ - явная сумма a_k * base^k:
def dec_from_digit_power(s, base):
digits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
s = s[::-1] # разворачиваем для степеней
total = 0
for i, ch in enumerate(s):
value = digits.index(ch.upper())
total += value * (base ** i)
return total
print(dec_from_digit_power('2A', 16)) # 42
print(dec_from_digit_power('110', 2)) # 642 6
Этот вариант может быть полезен для демонстрации принципа, но на практике уступает int() и методу Горнера.
Пример 5: перевод с использованием стандартной библиотеки (fractions)
Если требуется высокая точность для дробных чисел, можно использовать Decimal из decimal, но для перевода дробной части без потерь:
from fractions import Fraction
def bin_frac_exact(bin_str):
if '.' not in bin_str:
return int(bin_str, 2)
int_part, frac_part = bin_str.split('.')
int_val = int(int_part, 2) if int_part else 0
frac = Fraction(0, 1)
for k, d in enumerate(frac_part, 1):
frac += Fraction(int(d), 2 ** k)
return int_val + frac
print(bin_frac_exact('0.1')) # 0.5 (точно)
print(bin_frac_exact('0.101')) # 0.6250.5 0.625
Fraction хранит точное рациональное значение, что полезно для финансовых расчётов.