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:
2011年11月27日 星期日 10:24
谢谢各位的热情回复,我大体知道这个问题的所在了,谢谢了
Zeuux © 2024
京ICP备05028076号