Когда лучше использовать trunc () вместо int () для преобразования чисел с плавающим типом в целые числа? - PullRequest
0 голосов
/ 07 сентября 2018
Функции

trunc и int возвращают один и тот же выход для всех входов с плавающей запятой, которые я пробовал.

Они отличаются тем, что int также можно использовать для преобразования числовых строк в целые числа.

Итак, у меня двоякий вопрос:

  1. Я хотел бы знать, есть ли, кроме строк, какой-нибудь вход, для которого trunc и int дают разные выходы?

  2. Если нет, то когда лучше просто использовать trunc для преобразования чисел с плавающим типом в целые числа?

1 Ответ

0 голосов
/ 07 сентября 2018

int и math.trunc имеют несколько сходные отношения, как str и repr. int делегирует методу __int__ типа и возвращается к методу __trunc__, если __int__ не найден. math.trunc делегирует методу __trunc__ напрямую и не имеет запасного варианта. В отличие от __str__ и __repr__, которые всегда определены для object, как int, так и math.trunc могут вызывать ошибки из коробки.

Для всех известных мне встроенных типов, __int__ и __trunc__ определены разумно, где это уместно. Тем не менее, вы можете определить свой собственный набор тестовых классов, чтобы увидеть, какие ошибки вы получаете:

class A:
    def __int__(self):
        return 1

class B:
    def __trunc__(self):
        return 1

class C(): pass

math.trunc(A()) и math.trunc(C()) будут повышать TypeError: type X doesn't define __trunc__ method. int(C()) повысит TypeError: int() argument must be a string, a bytes-like object or a number, not 'C'. Однако, int(A()), int(B()) и math.trunc(B()) будут успешными.

В конце концов, решение о том, какой метод использовать, является одним из коннотаций. trunc по сути является математической операцией, аналогичной floor, в то время как int - это преобразование общего назначения, и оно успешно выполняется в других случаях.

И не забудьте о operator.index и методе __index__.

...