我的round函数在linux python 2.6.6中不起作用,而在Windows 3.4.2中它可以正常工作 使用以下类型的代码后:
Array[i] = round(math.e ** AnotherArray[i], 4)
v.3.4.2: 0.0025999999999999999 => 0.0026
v.2.6.6: 0.0025999999999999999 => 0.0025999999999999999
答案 0 :(得分:8)
它们的工作原理相同,但是Python 2.7及更高版本在打印repr
表示时会将浮点数舍入,以免混淆用户(语言和机器)独立)limitations of floating point arithmetic。
十进制数0.0026
无法完全表示为二进制float
,因此总会出现一些舍入错误。
如果您想减少混淆,只需print
数字:
>>> a = 0.0025999999999999999
>>> b = round(a,5)
>>> b # this calls repr(b)
0.0025999999999999999
>>> print b # this calls str(b)
0.0026
在实践中,这些舍入错误很少发生,尽管您需要了解它们,尤其是在比较相等时。
以下循环不会在0停止:
x = 1.0
while x != 0:
print x
x -= 0.1
为什么呢?我们来看看:
>>> x = 1.0
>>> while x != 0:
... print repr(x)
... x -= 0.1
... if x<0: break
...
1.0
0.90000000000000002
0.80000000000000004
0.70000000000000007
0.60000000000000009
0.50000000000000011
0.40000000000000013
0.30000000000000016
0.20000000000000015
0.10000000000000014
1.3877787807814457e-16
因此,请始终考虑sys.float_info.epsilon
:
>>> x = 1.0
>>> while abs(x) > sys.float_info.epsilon:
... print x
... x -= 0.1
...
1.0
0.9
0.8
0.7
0.6
0.5
0.4
0.3
0.2
0.1