何时使用 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 【问题描述】:

truncint 函数为我尝试过的每个浮点类型输入返回相同的输出。

它们的不同之处在于int 也可用于将数字字符串转换为整数。

所以我有两个问题:

    我想知道除了字符串之外,是否有任何输入可以让truncint 给出不同的输出?

    如果不是,什么时候最好只使用trunc 将浮点类型数转换为整数?

【问题讨论】:

如果浮点数的输出类型和值对于两者来说都是相同的,那么对你来说,更好的分类是什么? @Bazingaa 我认为问题更多在于是否有人能想到使用trunc而不是int实际上是正确的用例,而不是哪个是更好。确认它们实际上是相同的也可能是一个答案。 已经提到的strings例子的例外已经排除了它们相同的可能性。 所以一个可能的用例是,如果我希望演员在使用 float 以外的其他 dtype 时抛出错误,我可以使用 trunc @Bazingaa 可能是由于它们的实现存在一些根本差异,其中一个在非常大的数字的情况下实现得更快。 【参考方案1】:

intmath.truncstrrepr 有一些相似的关系。 int 委托给一个类型的 __int__ 方法,如果找不到 __int__ 则回退到 __trunc__ 方法。 math.trunc 直接委托给类型的 __trunc__ 方法并且没有回退。与始终为object 定义的__str____repr__ 不同,intmath.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__ methodint(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() 将浮点类型数转换为整数更好?的主要内容,如果未能解决你的问题,请参考以下文章

使用 . 将浮点数转换为字符串。而不是 , [重复]

C将浮点数转换为int

何时使用类别而不是对象?

C# - 将浮点数转换为整数...并根据余数更改整数

TRUNC 函数 在电子表格中怎么应用?是啥意思

EXCEL中的trunc函数