Python 3 int division运算符返回一个float?

时间:2018-03-14 16:17:46

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

在我的一项任务中,我遇到了一个奇怪的实现,我很好奇它是否是一个错误或设计行为。

在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

这个假定这样做吗?如果是这样,那么为什么会这样做?

2 个答案:

答案 0 :(得分:9)

来自PEP-238,介绍了新部门(强调我的):

  

分区语义

     

分区将在所有Python数值类型中实现,   并将具有以下语义:

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

除了结果类型是 a 和的常见类型   在操作之前强制 b

     

具体而言,如果 a b 属于同一类型,a//b也属于该类型。如果输入是不同类型的,它们是第一个   使用与所有其他规则相同的规则强制使用普通类型   算术运算符。

     

特别是,如果 a b 都是int或long,结果是   与这些类型的经典除法相同的类型和价值(包括   混合输入类型的情况; int//longlong//int都会   回来很久)。

     

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

     
3.5//2.0 == 1.0
     

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

     

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

所以是的,它应该表现得那样。 //表示整数除法,应该返回一个整数” - 不完全,它表示分区,并且应该返回等于的内容一个整数(你总是希望(a // b).is_integer()为真,其中任何一个操作数都是一个浮点数。)

答案 1 :(得分:-1)

我希望这可以澄清情况:

  

/分部

     

用左手操作数

分割左手操作数
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