Python 2.6与2.7中的浮点行为

所以我打破了Python 2.6解释器,我得到了这个:

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

但是在Python 2.7中,我得到了更像人类的结果,如下所示:

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中获得相同的结果,您必须自己格式化字符串:

'%.12g' % fp_value

或使用format()函数:

format(fp_value, '.12g')

请注意,在Python 2.7中,只更改了表示,而不是实际值.浮点值仍然是实数的二进制近似值,二进制分数并不总是加起来表示的确切数字.

如果您需要比浮动近似为您提供更高的精度,则需要切换到使用decimal.Decimal() type.这样可以以速度为代价保持精度(浮点运算在现代计算机上的硬件中处理).

转载注明原文:Python 2.6与2.7中的浮点行为 - 代码日志