无法理解 floor 函数的行为
Can't understand a behaviour of the floor function
我在 Python 2.7.13
工作
我有这个简单的代码:
import math
a = [1,3,9,10,11,56,99,100,101,106,555,998,999,1000,1001,1102,9999,10000,10001,10002]
for i in a:
print "%d : log : %f / floor : %f / int : %d" %(i, math.log(i,10), math.floor(math.log(i,10)), int(math.log(i,10)))
我想尝试对不同的数字使用 log 函数,看看当我对结果使用 floor 函数或将其转换为整数时会发生什么
输出为:
1 : log : 0.000000 / floor : 0.000000 / int : 0
3 : log : 0.477121 / floor : 0.000000 / int : 0
9 : log : 0.954243 / floor : 0.000000 / int : 0
10 : log : 1.000000 / floor : 1.000000 / int : 1
11 : log : 1.041393 / floor : 1.000000 / int : 1
56 : log : 1.748188 / floor : 1.000000 / int : 1
99 : log : 1.995635 / floor : 1.000000 / int : 1
100 : log : 2.000000 / floor : 2.000000 / int : 2
101 : log : 2.004321 / floor : 2.000000 / int : 2
106 : log : 2.025306 / floor : 2.000000 / int : 2
555 : log : 2.744293 / floor : 2.000000 / int : 2
998 : log : 2.999131 / floor : 2.000000 / int : 2
999 : log : 2.999565 / floor : 2.000000 / int : 2
1000 : log : 3.000000 / floor : 2.000000 / int : 2
1001 : log : 3.000434 / floor : 3.000000 / int : 3
1102 : log : 3.042182 / floor : 3.000000 / int : 3
9999 : log : 3.999957 / floor : 3.000000 / int : 3
10000 : log : 4.000000 / floor : 4.000000 / int : 4
10001 : log : 4.000043 / floor : 4.000000 / int : 4
10002 : log : 4.000087 / floor : 4.000000 / int : 4
除数字 1000 外,一切都按预期工作:您可以看到对数为 3.000000,但是当我使用 floor 函数时,它变为 2.00000,整数为 2,而我希望它为 3
我在这里错过了什么?
我认为您遇到了浮点精度问题:检查 math.log(1000,10)
:
的值
>>> math.log(1000,10)
2.9999999999999996
这意味着 math.floor(math.log(1000,10))
确实会导致 2
遗憾的是日志函数不准确:
Python 2.7.14 (default, Dec 11 2017, 16:08:01)
[GCC 7.2.1 20170915 (Red Hat 7.2.1-2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import math
>>> math.log(1000,10)
2.9999999999999996
打印时四舍五入为 3.0000。 math.log10
更好:
>>> math.log10(1000)
3.0
我在 Python 2.7.13
工作我有这个简单的代码:
import math
a = [1,3,9,10,11,56,99,100,101,106,555,998,999,1000,1001,1102,9999,10000,10001,10002]
for i in a:
print "%d : log : %f / floor : %f / int : %d" %(i, math.log(i,10), math.floor(math.log(i,10)), int(math.log(i,10)))
我想尝试对不同的数字使用 log 函数,看看当我对结果使用 floor 函数或将其转换为整数时会发生什么
输出为:
1 : log : 0.000000 / floor : 0.000000 / int : 0
3 : log : 0.477121 / floor : 0.000000 / int : 0
9 : log : 0.954243 / floor : 0.000000 / int : 0
10 : log : 1.000000 / floor : 1.000000 / int : 1
11 : log : 1.041393 / floor : 1.000000 / int : 1
56 : log : 1.748188 / floor : 1.000000 / int : 1
99 : log : 1.995635 / floor : 1.000000 / int : 1
100 : log : 2.000000 / floor : 2.000000 / int : 2
101 : log : 2.004321 / floor : 2.000000 / int : 2
106 : log : 2.025306 / floor : 2.000000 / int : 2
555 : log : 2.744293 / floor : 2.000000 / int : 2
998 : log : 2.999131 / floor : 2.000000 / int : 2
999 : log : 2.999565 / floor : 2.000000 / int : 2
1000 : log : 3.000000 / floor : 2.000000 / int : 2
1001 : log : 3.000434 / floor : 3.000000 / int : 3
1102 : log : 3.042182 / floor : 3.000000 / int : 3
9999 : log : 3.999957 / floor : 3.000000 / int : 3
10000 : log : 4.000000 / floor : 4.000000 / int : 4
10001 : log : 4.000043 / floor : 4.000000 / int : 4
10002 : log : 4.000087 / floor : 4.000000 / int : 4
除数字 1000 外,一切都按预期工作:您可以看到对数为 3.000000,但是当我使用 floor 函数时,它变为 2.00000,整数为 2,而我希望它为 3
我在这里错过了什么?
我认为您遇到了浮点精度问题:检查 math.log(1000,10)
:
>>> math.log(1000,10)
2.9999999999999996
这意味着 math.floor(math.log(1000,10))
确实会导致 2
遗憾的是日志函数不准确:
Python 2.7.14 (default, Dec 11 2017, 16:08:01)
[GCC 7.2.1 20170915 (Red Hat 7.2.1-2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import math
>>> math.log(1000,10)
2.9999999999999996
打印时四舍五入为 3.0000。 math.log10
更好:
>>> math.log10(1000)
3.0