2009-12-25 132 views
3

为什么-22/10在python中返回-3。任何关于此的指针都会对我有所帮助。Python中的浮点概念

+0

真实的大部分语言:C,C++,Java和C#等 – duffymo 2009-12-25 16:05:17

回答

5

PEP 238“改变部门操作员”,我认为很好地解释了这些问题。简而言之:在设计Python时,它在整数之间采用了“截断”的含义,仅仅是因为大多数其他编程语言自从1957年第一个FORTRAN编译器启动以来一直都在使用(全大写的语言名称和全部;-)。 (一种普遍的语言没有采用这个意思,使用/来产生浮点结果,div用于截断,是Pascal)。

在2001年,它决定这个选择不是最优的(引用PEP,“这使得表达式期望浮点或复杂结果容易出错,当整数不是预期但可能作为输入时”),并切换到使用一个新的运算符//请求除法截断,并更改/的含义以产生浮点结果(“真分度”)。

您可以明确地通过将声明

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 S,它的等效的Python 3 Fraction S的...:

>>> import gmpy 
>>> gmpy.mpq(1/2) 
mpq(1,2) 

具体而言(参见线3168和在the source以下),gmpy使用Stern-Brocot tree来获得浮点参数作为一个理性的“最佳实用逼近”(当然,这可以掩模精度损失)。

10

因为它默认是整数除法。整数除法向负无穷大方向舍入。请看:

>>> -22/10 
-3 
>>> -22/10.0 
-2.2000000000000002 

正:

>>> 22/10 
2 
>>> 22/10.0 
2.2000000000000002 

关于浮点的看似“不准确”,这是一个伟大的文章阅读:Why are floating point calculations so inaccurate?

+0

为什么浮点计算如此不准确?有没有关于这个的文件? – Chaitanya 2009-12-25 16:04:53

+0

更新回答您的评论 – 2009-12-25 16:06:34

+0

如果需要更高精度,请查看http://docs.python.org/library/decimal.html Python十进制模块。 – SapphireSun 2009-12-25 23:44:45

2

因为你正在做一个整数师。如果你做-22.0/10,你会得到正确的结果。

5

默认情况下,当两个操作数都是整数时,当前版本的Python 2.x(我不确定关于3.x)给出了任何算术运算符的整数结果。但是,有一种方法可以改变这种行为。

from __future__ import division 
print(22/10) 

输出

2.2000000000000002 

当然,一个更简单的方法是简单地做一个操作数由前两个答案中描述的浮动。

2

发生这种情况是因为整数除法的操作返回数字,当乘以除数给出的最大可能整数不大于您划分的数字。

这就是为什么22/10给出了2:10 * 2 = 20,这是10的最大整数倍不超过20

大当此去否定,你的操作变得-22/10。你的结果是-3。应用与前一种情况相同的逻辑,我们看到10 * -3 = -30,这是10的最大整数倍不大于-20。

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

希望帮助