为什么-22/10在python中返回-3。任何关于此的指示对我都有帮助。
答案 0 :(得分:10)
因为它是默认的整数除法。并且整数除法向无穷大舍入。看看:
>>> -22/10
-3
>>> -22/10.0
-2.2000000000000002
正:
>>> 22/10
2
>>> 22/10.0
2.2000000000000002
关于浮点似乎“不准确”,这是一篇很好的文章:Why are floating point calculations so inaccurate?
答案 1 :(得分:5)
默认情况下,当两个操作数都是整数时,当前版本的Python 2.x(我不确定3.x)会为任何算术运算符提供整数结果。但是,有一种方法可以改变这种行为。
from __future__ import division
print(22/10)
输出
2.2000000000000002
当然,更简单的方法是简单地使其中一个操作数浮动,如前两个答案所述。
答案 2 :(得分:5)
PEP 238,“改变分部操作员”,我认为这些问题很好地解释了。简而言之:当Python被设计时,它采用整数之间/
的“截断”含义,因为大多数其他编程语言自1957年第一个FORTRAN编译器启动以来就做过(全大写语言名称和所有; - )。 (使用/
生成浮点结果并使用div
进行截断的一种广泛使用的语言是Pascal)。
在2001年,决定这个选择不是最优的(引用PEP,“这使表达式期望浮点或复杂结果容易出现错误,当整数不被预期但可能作为输入时”),并转而使用new运算符//
请求使用截断进行除法,并更改/
的含义以生成浮点结果(“true division”)。
您可以通过放置语句
来显式请求此行为from __future__ import division
在模块的开头(命令行开关-Q
到python
解释器也可以控制除法的行为)。对于x的所有值,缺少这样的“从未来导入”(和命令行开关使用),Python 2.x,总是使用“经典划分”(即,/
在int
之间截断或多个)。
然而,Python 3总是使用“真正的划分”(/
之间int
生成float
)。
注意一个奇怪的推论(在Python 3中)......:
>>> from fractions import Fraction
>>> Fraction(1/2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/fractions.py", line 100, in __new__
raise TypeError("argument should be a string "
TypeError: argument should be a string or a Rational instance
因为/
产生float
,所以它不能作为Fraction
的参数接受(否则精度可能会默默地丢失)。您必须使用字符串,或将分子和分母作为单独的参数传递:
>>> Fraction(1, 2)
Fraction(1, 2)
>>> Fraction('1/2')
Fraction(1, 2)
gmpy使用了一种不同的,更宽容的方法来构建mpq
,它相当于Python 3 Fraction
...:
>>> import gmpy
>>> gmpy.mpq(1/2)
mpq(1,2)
具体来说(参见第3168行和the source中的后续内容),gmpy使用Stern-Brocot tree来获得浮点参数的“最佳实际近似”作为理性(当然,这个可以掩盖精度损失。)
答案 3 :(得分:2)
因为你正在进行整数除法。如果你改为-22.0 / 10,你将得到正确的结果。
答案 4 :(得分:2)
这是因为整数除法的运算返回数字,当乘以除数时,给出的最大可能整数不大于你划分的数字。
这正是为什么22/10给出2:10 * 2 = 20,这是10的最大整数倍且不大于20。
当这变为否定时,您的操作变为-22/10。你的结果是-3。应用与前一种情况相同的逻辑,我们看到10 * -3 = -30,这是10的最大整数倍,不大于-20。
这就是为什么在处理负数时会得到一个意想不到的答案。
希望有所帮助