Python中的浮点概念

时间:2009-12-25 15:59:52

标签: python floating-point

为什么-22/10在python中返回-3。任何关于此的指示对我都有帮助。

5 个答案:

答案 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

在模块的开头(命令行开关-Qpython解释器也可以控制除法的行为)。对于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。

这就是为什么在处理负数时会得到一个意想不到的答案。

希望有所帮助