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

cl25kdpy  于 2021-07-13  发布在  Java
关注(0)|答案(2)|浏览(376)

我最近注意到 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。
但对我来说,两个类似的操作(浮点除法到整数)应该返回不同的结果似乎不合逻辑。
功能之间的差异有什么动机吗?
谢谢您。

lndjwyie

lndjwyie1#

一致性。
你需要遵循一些非常基本的和看似不相关的解释来理解它。
在学校里你学会了用余数除法。你做过这样的计算:

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中使用哪个操作符来获得正确的结果。
问得好。继续学习。

1zmg4dgp

1zmg4dgp2#

我想说的是,你观察到的这两个操作在直觉上应该是相似的,这是意料之中的,因为在正数上它们的行为是相同的。但如果你看看它们的起源(一个来自数学,另一个来自计算机科学),那么它们不同的行为就更有意义了。
您可以查看以下概念:
floor division也称为应用于数学除法的floor函数
类型转换/类型转换

i) floor division也称为应用于数学除法的floor函数
楼层函数是数学中一个非常成熟的概念。
来自mathworld.wolfram:
楼层函数| | | x |,也称为最大整数函数或整数值(spanier和oldham 1987),给出小于或等于x的最大整数。楼层功能的名称和符号是由k。e。艾弗森(格雷厄姆等人,1994年)
所以楼层划分只不过是应用于数学划分的楼层函数。行为非常清楚,“数学上精确”。
ii)类型转换/类型铸造
来自维基百科:
在计算机科学中,类型转换、类型转换、类型强制和类型篡改是将表达式从一种数据类型更改为另一种数据类型的不同方式。
在大多数编程语言中,浮点到整数的转换形式是通过舍入规则应用的(因此有一个约定):
向0舍入–向0舍入(也称为截断)
四舍五入规则符合ieee 754。
因此,换句话说,python中整数除法和float到int的转换之间的区别是一个数学上的原因,下面是guido van rossum的一些想法(我想我不必介绍他:d)(来自博客python的历史,文章“为什么python的整数除法层”)
这让一些人感到不安,但有一个很好的数学原因。整数除法运算(//)及其同级模运算(%)结合在一起,并满足一个良好的数学关系(所有变量都是整数):
a/b=q,余数r
以至于
b*q+r=a和0<=r<b
(假设a和b大于等于0)。

相关问题