trunc
和int
函数为我尝试过的每个浮点类型输入返回相同的输出。
它们的不同之处在于int
也可以用于将数字字符串转换为整数。
所以我有两个问题:
我想知道除字符串以外,是否还有trunc
和int
给出不同输出的输入?
如果不是,什么时候最好使用trunc
将浮点型数字转换为整数?
答案 0 :(得分:6)
int
和math.trunc
与str
和repr
具有相似的关系。 int
委托给类型的__int__
方法,如果未找到__int__
,则退回到__trunc__
方法。 math.trunc
直接委托给该类型的__trunc__
方法,并且没有后备。与始终为object
定义的__str__
和__repr__
不同,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__
方法。