【问题标题】:Python 3 int division operator is returning a float?Python 3 int 除法运算符返回浮点数?
【发布时间】:2018-03-14 16:17:45
【问题描述】:

在我的一个作业中,我遇到了一个奇怪的实现,我很好奇这是一个错误还是设计的行为。

在 Python 3 中,除以/ 返回一个浮点数,// 表示整数除法,应该返回一个整数。我发现,如果在进行整数除法时其中一个值是浮点数,它将返回一个浮点数。

例子:

# These all work as expected
10 / 2
-> 5.0
11 / 2
-> 5.5
10 // 2
-> 5
11 // 2
-> 5
# Here things start to get weird
10.0 // 2
-> 5.0
10 // 2.0
-> 5.0
11.0 // 2
-> 5.0

应该这样做吗?如果是这样,为什么会这样?

【问题讨论】:

    标签: python python-3.x floating-point integer division


    【解决方案1】:

    来自PEP-238,介绍了新部门(重点是我的):

    楼层划分的语义

    将在所有 Python 数字类型中实现楼层划分, 并将具有以下语义:

    a // b == floor(a/b)
    

    除了结果类型将是 ab 在操作之前被强制。

    具体来说,如果 ab 属于同一类型,a//b 也将属于该类型。 如果输入是不同的类型,他们是第一个 使用用于所有其他类型的相同规则强制转换为通用类型 算术运算符。

    特别是,如果 ab 都是整数或长整数,则结果具有 与这些类型的经典除法相同的类型和值(包括 混合输入类型的情况; int//longlong//int 都将 返回一个long)。

    对于浮点输入,结果为浮点数。例如:

    3.5//2.0 == 1.0
    

    对于复数,// 引发异常,因为 floor() 的 不允许使用复数。

    对于用户定义的类和扩展类型,所有语义都由 类或类型的实现。

    所以是的,它应该表现得那样。 // 表示整数除法,应该返回一个整数” - 不完全是,它表示 地板除法,应该返回一个 等于 整数(当任一操作数为浮点数时,您总是希望 (a // b).is_integer() 为真)。

    【讨论】:

    • 内部发生了什么?对于混合、整数和浮点数,值转换为浮点数然后调用 float.__floordiv__?
    • @Chris_Rands 你的意思是在 CPython 实现中?我不知道,你得看看github.com/python/cpython
    • 是否有一个用例需要你得到一个浮点数而不是一个整数,因为小数点右边永远不会有任何东西?
    • @Kayla 如果你总是想要一个 int,很容易明确地说 int(a // b)。但总的来说,这种行为与arithmetic conversions 和其他binary arithmetic operations 一致,例如1 == 1.0 并在大多数用例中表现得足够相似。
    • 有趣的是,PEP 3141 建议 __floordiv__ 特殊方法应始终返回一个 Integral 实例,但 PEP 3141 的那部分从未为 float 类型实现。另见bugs.python.org/issue22444
    【解决方案2】:

    我希望这可以澄清情况:

    /分部

    左手操作数除以右手操作数

    b / a = 2
    

    //楼层划分

    操作数的除法,其结果是 小数点后的数字被删除。但如果其中一个操作数 为负数,结果为下限,即从零四舍五入 (向负无穷大)

    9//2 = 4 and 9.0//2.0 = 4.0, -11//3 = -4, -11.0//3 = -4.0
    

    https://www.tutorialspoint.com/python/python_basic_operators.htm

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多