0

我正在编写一个 Python 程序来在输入的数字之前打印十的所有幂。例如,如果输入为 12345,则程序应输出 10、100、1000、10000。这是我的程序 -

import math
limit = raw_input('Check until: ');
tenpowers=1
for i in range(1, int(limit)+1):
     if math.log(i, 10)==tenpowers:
         print 'tenpower! - ', i
         tenpowers=tenpowers+1

只有当输入值小于或等于 100 时,我的程序才能正常工作。这是输出 -

D:\py>python prog.py
Check until: 100
tenpower! -  10
tenpower! -  100

D:\py>python prog.py
Check until: 12345
tenpower! -  10
tenpower! -  100

注意我第二次输入 12345 时仍然只输出 10 和 100。这里出了什么问题?

4

2 回答 2

2

math.log使用浮点数,这些几乎总是涉及一些舍入错误。

>>> math.log(1000, 10)
2.9999999999999996

如果您需要准确,您应该更改算法以生成 10 的幂(只需将最后的幂乘以 10)并继续,只要新的幂小于您的输入数字。

>>> limit = 12345
>>> power = 10
>>> while power < limit:
...     print power
...     power = power * 10
... 
10
100
1000
10000

这保证是准确的,因为它不涉及任何浮点数。(而且速度也快得多)

于 2013-02-08T01:39:49.763 回答
1

浮点数学又来了!查看返回的值math.log

>>> math.log(10000, 10)
4.0
>>> math.log(1000, 10)
2.9999999999999996
>>> math.log(100, 10)
2.0
>>> math.log(10, 10)
1.0
于 2013-02-08T01:42:48.300 回答