Преобразование чисел в десятичную систему с помощью Python

Раздел: Основы 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)  # 26

Python восьмеричная система (восьмеричная система счисления в 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'))  # 13

16 система счисления 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))   # None
10
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))  # 6
42
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.625
0.5
0.625

Fraction хранит точное рациональное значение, что полезно для финансовых расчётов.

Перевод числа в десятичную систему счисления в Python - comments

En
перевод в десятичную систему счисления python (python)