在python中,整数除法和浮点到整数转换之间存在差异的原因是什么?

在python中,整数除法和浮点到整数转换之间存在差异的原因是什么?,python,python-3.x,integer-division,Python,Python 3.x,Integer Division,我最近注意到int()将浮点向0舍入,而整数除法将浮点向其底部舍入 例如: -7 // 2 = -4 int(-7/2) = -3 我已阅读文件,其中规定: 类int(x,基数=10) 返回一个由数字或字符串x构造的整数对象,如果没有参数>则返回0。如果x是一个数字,则返回x.int()。对于浮点数,将向零截断。 以及: 楼层划分 将向下舍入为最接近整数的数学除法。地板除法运算符为//。例如,表达式11//4的计算结果为2,而float-true除法返回的值为2.75。注意(-11)//4是-

我最近注意到
int()
将浮点向0舍入,而整数除法将浮点向其底部舍入

例如:

-7 // 2 = -4
int(-7/2) = -3
我已阅读文件,其中规定:

类int(x,基数=10)

返回一个由数字或字符串x构造的整数对象,如果没有参数>则返回0。如果x是一个数字,则返回x.int()。对于浮点数,将向零截断。

以及:

楼层划分

向下舍入为最接近整数的数学除法。地板除法运算符为//。例如,表达式11//4的计算结果为2,而float-true除法返回的值为2.75。注意(-11)//4是-3,因为向下四舍五入为-2.75。见政治公众人物第238页

但对于我来说,两个类似的操作(浮点除法到整数)应该返回不同的结果似乎不合逻辑

功能之间的差异有什么动机吗

谢谢。

一致性

你需要遵循一些基本的、看似不相关的解释来理解它

在学校里你学会了带余数的除法。你已经做过这样的计算:

8 ÷ 4 = 2 R 0
7 ÷ 4 = 1 R 3
6 ÷ 4 = 1 R 2
5 ÷ 4 = 1 R 1
4 ÷ 4 = 1 R 0
3 ÷ 4 = 0 R 3
2 ÷ 4 = 0 R 2
1 ÷ 4 = 0 R 1
0 ÷ 4 = 0 R 0
        ^------ This is the result of x // 4
            ^-- This is the result of x % 4 (modulo)
稍后,您将学习实数的除法:

8 ÷ 4 = 2.0
7 ÷ 4 = 1.75
6 ÷ 4 = 1.5
5 ÷ 4 = 1.25
4 ÷ 4 = 1.0
3 ÷ 4 = 0.75
2 ÷ 4 = 0.5
1 ÷ 4 = 0.25
0 ÷ 4 = 0.0
        ^--- Note that the number in front of the . is int(x/4)
在此之前,您可能认为
x//4
int(x/4)
总是给出相同的结果。这就是你目前对形势的理解

但是,看看整数除法中会发生什么:R周期后面的数字从3、2、1到0,然后重新启动:3、2、1、0。R前面的数字每四步递减一次

那么,这将如何进行

 8 ÷ 4 =  2 R 0
 7 ÷ 4 =  1 R 3
 6 ÷ 4 =  1 R 2
 5 ÷ 4 =  1 R 1
 4 ÷ 4 =  1 R 0
 3 ÷ 4 =  0 R 3
 2 ÷ 4 =  0 R 2
 1 ÷ 4 =  0 R 1
 0 ÷ 4 =  0 R 0
-1 ÷ 4 = -1 R 3
         ^------ We have to decrease now, because we already have 0 four times
              ^-- We have to restart the cycle at 3
同时,实数部分为我们提供:

-1 ÷ 4 = -0.25
          ^----- There is still a 0 in front of the .
这就是为什么
-1//4
给出-1,而
int(-1/4)
给出0

功能之间的差异有什么动机吗

嗯,它们有不同的用途:
/
是带余数的整数计算的一部分,
int()
为您提供了实数运算的
前面的部分

您决定要计算什么,然后决定在Python中使用哪个操作符来获得正确的结果


好问题。继续学习。

我想说,你观察到这两个操作在直觉上应该是相似的,这是意料之中的,因为它们在正数上的行为是相同的。但是如果你看看它们的起源(一个来自数学,另一个来自计算机科学),那么它们不同的行为就更有意义了

您可以查看这些概念的背后:

  • Floor division又名应用于数学分区的Floor函数
  • 类型转换/类型转换
==================================================================

I)楼层划分,即应用于数学划分的楼层函数

楼层函数是数学中一个非常成熟的概念

发件人:

楼层函数| ux |,也称为最大整数函数或整数值(Spanier和Oldham 1987),给出小于或等于x的最大整数。楼层功能的名称和符号是由K.E.艾弗森(Graham et al.1994)创造的

所以楼层划分只是应用于数学划分的楼层函数。行为非常清楚,“数学上精确”

II)类型转换/类型转换

发件人:

在计算机科学中,类型转换,类型转换,类型转换 强制和类型变戏法是改变游戏的不同方式 从一种数据类型到另一种数据类型的表达式

在大多数编程语言中,浮点到整数的转换形式是通过舍入规则应用的(因此有一个惯例):

  • 向0舍入–定向向零舍入(也称为 截断)
四舍五入规则


因此,换句话说,python中整数除法和浮点到整数转换之间存在差异的原因是一个数学原因,下面是Guido van Rossum的一些想法(我想我不必介绍他:D)(来自博客python的历史,文章)

这让一些人感到不安,但有一个很好的数学原因。 整数除法运算(//)及其同级模 运算(%),一起去满足一个好的数学模型 关系(所有变量均为整数):

a/b=q,余数为r

以致

b*q+r=a和0=0)


在实践中,这允许一个技巧:如果你有-1个糖果,你把它送给4个朋友,那么剩下3个糖果。太好了,不是吗?您只需要了解如何拥有-1 sweets。它确实创建了某种一致性,但据我所知,在python 3中添加
/
操作符的动机是为了避免强制使用int(float)。如果不是这样,那么我应该选择何时使用
int()
实现,何时使用
/
实现,那么这只是一个错误的假设。这没什么不好的,只要你测试你的假设的正确性,这可能会在50%的情况下失败(至少对我来说是这样)。我在回答中加了一些关于它的话。@IsaacDj你可能想知道“楼层划分”操作员背后的故事。@EricLippert:我不认为这很奇怪。我们不能假设有损操作提供与精确操作相同的结果。用代码说话:
Math.Floor(3.23)!=-数学地板(-3.23)
出于同样的原因
-(-x)/y)
不必等于
x//y
。相关链接: