【发布时间】:2014-04-23 12:59:20
【问题描述】:
w = 0
while w <= 1.0:
print str(int(w*10))
w += 0.1
为什么这个答案是 0 1 2 3 4 5 6 7 7 9 9 8 和 10 在哪里?
我只是用
print str(int(0.8*10))
它打印'8'
谢谢你! :D
【问题讨论】:
标签: string python-2.7 int floating
w = 0
while w <= 1.0:
print str(int(w*10))
w += 0.1
为什么这个答案是 0 1 2 3 4 5 6 7 7 9 9 8 和 10 在哪里?
我只是用
print str(int(0.8*10))
它打印'8'
谢谢你! :D
【问题讨论】:
标签: string python-2.7 int floating
因为.1不能用二进制表示,所以存在一些舍入误差。让我们尝试一个不同的脚本:
w = 0
while w <= 1.0:
print repr(w)
w += 0.1
它打印什么?
0
0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999
【讨论】:
int 截断为零,而不是四舍五入。这就是为什么int(7.9) 是7,而不是8。
那是因为浮点的设计。 0.1 是一个分数,不能完全表示为二进制(以 2 为底)分数。
你自己看看,我的意思是什么:
我删除了对 int 的转换和不必要的对 str 的转换:
w = 0
while w <= 1.0:
print(w*10)
w += 0.1
打印:
0
1.0
2.0
3.0000000000000004
4.0
5.0
6.0
7.0
7.999999999999999
9.0
9.999999999999998
因为将 float 转换为 int 总是会切断该点之后的部分, 它将打印 7 和 9 两次。
有关更多信息,请参阅http://docs.python.org/2.7/tutorial/floatingpoint.html#tut-fp-issues。 特别是:http://docs.python.org/2.7/tutorial/floatingpoint.html#representation-error
【讨论】: