Python 2.6与2.7中的浮点行为

Floating point behavior in Python 2.6 vs 2.7

所以我将介绍python 2.6解释器,并得到:

1
2
3
4
5
6
7
8
9
Python 2.6.6 (r266:84292, Nov 22 2013, 12:16:22)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type"help","copyright","credits" or"license" for more information.
>>> 2.1
2.1000000000000001
>>> 2.2
2.2000000000000002
>>> 2.2
2.2000000000000002

但是在Python2.7中,我得到了更多类似人类的结果,如下所示:

1
2
3
4
5
6
7
8
9
10
Python 2.7.5+ (default, Sep 19 2013, 13:48:49)
[GCC 4.8.1] on linux2
Type"help","copyright","credits" or"license" for more information.
>>> 5.4
5.4
>>> 1.1
1.1
>>> 0.2
0.2
>>>

我想问一下为什么会发生这种情况,我怎么可能使python 2.6的行为类似于2.7呢?


python 2.7中的float.__repr__()float.__str__()方法发生了变化;python 3.1 float-to-string转换方法被反向移植,值现在被四舍五入。

float.__str__()的C源代码使用g格式化程序代码将浮点值格式化为sprintf()函数,精度为12个位置。

要在python 2.6中获得相同的结果,您必须自己格式化字符串:

1
'%.12g' % fp_value

或使用format()功能:

1
format(fp_value, '.12g')

注意,在python 2.7中,只有表示形式发生了变化,而不是实际值。浮点值仍然是实数的二进制近似值,二进制分数并不总是与所表示的确切数字相加。

如果需要比float近似值更精确,则需要改用decimal.Decimal()类型。这可以以速度为代价保持精度(浮点运算在现代计算机的硬件中处理)。