在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函数
- 类型转换/类型转换
- 向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
。相关链接: