Странная ошибка: ZeroDivisionError: деление с плавающей точкой на ноль - PullRequest
0 голосов
/ 02 ноября 2018

Я обнаружил странное поведение и надеюсь, что у кого-то есть объяснение этому. Я делаю:

if len(list) > 1 and len(list2) > 1:
   total = sum(list) + sum(list2)
   result = percentage(sum(list), total)

def percentage(part, whole):
    return float(part) / float(whole) *100

Два списка представляют собой сочетание значений типа float и int. Я время от времени получаю:

ZeroDivisionError: деление с плавающей точкой на ноль

Это не имеет смысла для меня. У кого-нибудь есть идеи, что происходит?

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Используйте попытку / исключение:

if len(list) > 1 and len(list2) > 1:
           total = sum(list) + sum(list2)
           result = percentage(sum(list), total)

        def percentage(part,whole):
            while True: 
                try:
                    return float(part) / float(whole) * 100
                except ValueError as e:
                    print(e)

Это не приведет к выходу из программы из-за ошибки, она просто распечатает ошибку.

0 голосов
/ 02 ноября 2018

Проблема очевидна, если вы распечатаете значения part и whole, которые вызвали эту ошибку.

Решение состоит в том, чтобы обрабатывать любые ошибки деления на ноль, например

       try:
           result = percentage(sum(list), total)
       except ZeroDivisionError:
           # Handle the error in whatever way makes sense for your application

Кроме того, вы можете проверить на ноль, прежде чем делить

def percentage(part,whole):
    if whole == 0:
        if part == 0:
            return float("nan")
        return float("inf")
    return float(part) / float(whole) *100

(Спасибо Джорану Бизли и Максу за то, что они сделали это математически правильным)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...