何时使用 trunc() 而不是 int() 将浮点类型数转换为整数更好?
Posted
技术标签:
【中文标题】何时使用 trunc() 而不是 int() 将浮点类型数转换为整数更好?【英文标题】:When is it better to use trunc() instead of int() to convert floating type numbers to integers? 【发布时间】:2019-02-12 20:53:39 【问题描述】:trunc
和 int
函数为我尝试过的每个浮点类型输入返回相同的输出。
它们的不同之处在于int
也可用于将数字字符串转换为整数。
所以我有两个问题:
我想知道除了字符串之外,是否有任何输入可以让trunc
和int
给出不同的输出?
如果不是,什么时候最好只使用trunc
将浮点类型数转换为整数?
【问题讨论】:
如果浮点数的输出类型和值对于两者来说都是相同的,那么对你来说,更好的分类是什么? @Bazingaa 我认为问题更多在于是否有人能想到使用trunc
而不是int
实际上是正确的用例,而不是哪个是更好。确认它们实际上是相同的也可能是一个答案。
已经提到的strings
例子的例外已经排除了它们相同的可能性。
所以一个可能的用例是,如果我希望演员在使用 float
以外的其他 dtype 时抛出错误,我可以使用 trunc
。
@Bazingaa 可能是由于它们的实现存在一些根本差异,其中一个在非常大的数字的情况下实现得更快。
【参考方案1】:
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__
方法。
【讨论】:
还要注意__int__
应该(必须?)返回一个int
类型的值,而__trunc__
只需要返回一个Integral
类型的值(一个抽象基类)。通常但不一定,返回值的具体类型是int
。
@chepner。应该:) 如果您非常小心地使用未正确实施的__int__
,它不会给您带来任何问题。我肯定尝试过类似的事情。以上是关于何时使用 trunc() 而不是 int() 将浮点类型数转换为整数更好?的主要内容,如果未能解决你的问题,请参考以下文章