Перейти к содержанию
Содержание

Суммы из выгрузки в Python: проверяйте исходную строку до Decimal

Если суммы из файла сначала прочитали как float, последующий Decimal уже не восстановит исходную десятичную запись. При сверке выгрузок лучше сохранять сумму текстом до проверки формата.

Зафиксируйте договорённость о данных

До расчёта определите валюту, разделитель дробной части, допустимую точность и единицу суммы. Рубли и копейки в двух файлах не становятся сравнимыми от выбора одного типа числа. Отдельно проверьте, обозначает ли строка продажу, удержание или возврат.

Суммы из выгрузки в Python: проверяйте исходную строку до Decimal

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

Отделите проверку от округления

Ниже заготовка для разработчика: на входе строка с десятичной точкой, суммы должны быть конечными и без ненулевых долей мельче сотой. Это выбранные условия проверки файла, а не универсальное правило для всех валют и документов.

from decimal import Decimal


def parse_amount(raw):
    if not isinstance(raw, str):
        raise TypeError("Нужна исходная строка суммы")
    value = Decimal(raw)
    if not value.is_finite():
        raise ValueError("Сумма должна быть конечной")
    if value != value.quantize(Decimal("0.01")):
        raise ValueError("Точность суммы не согласована")
    return value

quantize приводит к заданному разряду. Здесь результат сравнивается с исходным числом: неподходящая точность вызывает ошибку, а не молча меняет сумму. Некорректная строка также остановит разбор. Не перехватывайте такую ошибку с подстановкой нуля.

Если файл использует запятую или разделитель тысяч, сначала опишите отдельное правило чтения. Не удаляйте все знаки подряд: можно потерять минус либо неверно понять дробную часть. Сохраняйте номер строки и исходный текст при отказе обработки.

Сверьте сумму вместе с составом

После разбора сопоставьте число принятых строк и список отклонённых. Суммируйте только сопоставимые операции в одной валюте, сохраняя связь с их идентификаторами. Совпадение общего итога не исключает двух взаимно компенсирующих ошибок.

Если Decimal-сумма всё ещё не совпадает с документом, проверьте состав, знаки операций и этап округления у источника. Режим округления должен следовать согласованным правилам расчёта. Выбор Decimal решает вопрос представления чисел, но не подтверждает полноту выгрузки и правильность первичного документа.

Теги

Комментарии 0

0 / 1500

Популярные статьи