Python论坛  - 讨论区

标题:python 浮点型输出问题

马

2011年11月17日 星期四 13:43

我用的是python2.6.6,在控制台输入一些小数字,得的的很离奇的结果,如下:

>>> 2.2
2.2000000000000002
>>> 3.3
3.2999999999999998
>>> 2.2/1
2.2000000000000002

 

但是有些是没有问题的

>>> 3.5
3.5
>>> 1.2
1.2

请问这是什么问题

2011年11月18日 星期五 16:24

是啊,试了一下,确实这样,为什么呢?

但是在winpython控制台输入就没问题

2011年11月18日 星期五 21:38

我在2.7.2上是没有这个问题的。

记得在网易的公开课上看过这个问题,但老师就浮点数的显示原理讲了一通,并重申要小心浮点数云云。。

我想,或许是2.7.2版本就这个问题对expr函数加了补丁了吧,我未进行深入的研究。

呼唤达人解释。

马

2011年11月21日 星期一 10:38

是,后来问别人,别人也不知道如何解释这个问题

2011年11月22日 星期二 16:26

浮点数内部实际上使用有限位的二进制小数保存的,例如下面是一个二进制小数:

1.101

它的值是1 + 0.5 + 0.125,小数点之后每一位都是前一位的二分之一。

有些10进制小数无法用二进制小数精确表示。例如0.2在10进制中虽然是一个简单的小数,它在二进制中是一个无限循环小数。

0.0011001100110011001100110011001100110011001100110011001...

我们只能截取其中的一部分保存起来,因此那一部分所表示的数据的真实值是:

0.20000000000000001.....

2011年11月22日 星期二 16:51

这个解答很给力。

可是,那1.2为什么没有那么长得尾数,而0.2和2.2却有呢?

还有,如果客户要求精度很高,当然可能比较变态,那该如何是好呢?

2011年11月22日 星期二 17:54

可能源码可以解释一切,精度要求比较高参考http://docs.python.org/tutorial/floatingpoint.html

2011年11月22日 星期二 21:08

有时间,真的很有必要啃啃源码了。。。

2011年11月24日 星期四 08:47

1.2其实也有尾数,只是用那么多位10进制表示的时候,那个尾数刚好看不见,1.2的真实值其实是:

1.1999999999999999555910790149937383830547332763671875

0.20000000000000001

比较会发现如果保留17位小数的话,1.2的真实值刚好四舍五入为1.2

下面是0.2的真实值:

0.200000000000000011102230246251565404236316680908203125

如果要求10进制小数完全精确,那么可以用10进制数:decimal.Decimal

如果要高精度的二进制浮点数,那么可以用mpmath:

http://code.google.com/p/mpmath/

马

2011年11月27日 星期日 10:24

谢谢各位的热情回复,我大体知道这个问题的所在了,谢谢了

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2024

    京ICP备05028076号