Python2.6和2.7中的浮点行为

Python2.6和2.7中的浮点行为,python,python-2.7,floating-point,python-2.6,floating-accuracy,Python,Python 2.7,Floating Point,Python 2.6,Floating Accuracy,因此,我打开了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

因此,我打开了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
>>> 
我想问一下为什么会发生这种情况,以及我如何才能使Python2.6表现得像2.7一样?

浮点值。

;Python3.1浮点到字符串的转换方法是后端口的,现在值是四舍五入的

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

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

'%.12g' % fp_value
或者使用
format()
函数:

format(fp_value, '.12g')
请注意,在Python2.7中,只更改了表示,而没有更改实际值。浮点值仍然是实数的二进制近似值,二进制分数的总和并不总是与所表示的确切数字相等


如果您需要比
float
近似值提供的精度更高,则需要切换到使用。这以速度为代价来保持精度(浮点运算在现代计算机的硬件中处理)。

你知道2.7只是在骗你,实际上并不更准确吗?@Wooble:的确,2.7并不更准确,但2.6和2.7都在骗你。几乎所有使用二进制浮点的东西都是谎言,就你所说的意义而言。(根据IEEE规范的定义,2.7实际上比2.6更精确地进行取整。)谢谢!我只需要2个位置的精度,而不是12个。在Python 2.6中。。(如您所说的表示方式)@Konos5:该值将四舍五入到最多12位;试试看,没错。真管用。。!但是,结果是一个字符串。你有什么想法可以让我把它变成一个(扭曲的)适当的浮动吗?@Konos5:你不能。这不是浮点值。Python2.6和2.7中的值没有改变,只改变了它们的字符串表示形式。您误解了浮点值的工作原理。@Konos5:在Python 2.6和2.7中尝试以下方法:
format(fp,.53f')
,以打印最大小数的浮点值,您将看到这两种方法仍然是近似值。