def testfun(testValue):
power = 20
for i in range(0, 10):
z = testValue/(10.0**i)
print("Iteration: "+str(i)+" , z: "+str(z))
if ( z <= 0 ):
power = i
break
return power
testfun(9000)
我编写了一个小程序来查找最小的整数,其值(在本例中为9000)传递给函数#34; testfun&#34;当参数除以10的幂加到该整数时,将小于零。
然而当它返回给我时(当testValue = 9000时),该值将返回给我20。
我在编写Arduino时在C中遇到了同样的问题,我也尝试用Python测试它,但是我遇到了同样的问题。
有些人能给我一个解释吗?
答案 0 :(得分:0)
当您使用10.0
时,您需要使用Floor Division(//
)代替/
或在代码的顶层添加from __future__ import division
:
def testfun(testValue):
power = 20
for i in range(0, 10):
z = testValue//(10.0**i) # or use z = testValue/(10**i)
#print("Iteration: "+str(i)+" , z: "+str(z))
if ( z <= 0 ):
power = i
break
return power
print testfun(9000)
结果:
4
Floor Division - 操作数的除法,其中结果是删除小数点后的数字的商。
同样在C
中,您需要使用floor
将分割结果转换为double:
floor(a/b)
答案 1 :(得分:0)
或者您可以尝试math.floor
:
import math
def testfun(testValue):
power = 20
for i in range(0, 10):
z = math.floor(testValue / (10.0**i))
print("Iteration: "+str(i)+" , z: "+str(z))
if ( z == 0 ):
power = i
break
return power
print testfun(9000)
输出:
Iteration: 0 , z: 9000.0
Iteration: 1 , z: 900.0
Iteration: 2 , z: 90.0
Iteration: 3 , z: 9.0
Iteration: 4 , z: 0.0
4
在您的代码中,您的计算对于浮点类型是准确的。这会带来更多的步骤,但是只有整数部分和舍入才能获得。因此,0.05表示0.如果使用int()
将获得相同的结果:
import math
def testfun(testValue):
power = 20
for i in range(0, 10):
z = int(testValue / (10.0**i))
print("Iteration: "+str(i)+" , z: "+str(z))
if ( z == 0 ):
power = i
break
return power
print testfun(9000)
输出:
Iteration: 0 , z: 9000
Iteration: 1 , z: 900
Iteration: 2 , z: 90
Iteration: 3 , z: 9
Iteration: 4 , z: 0
4
如果您尝试使用(10**i)
的此代码,则相同:
def testfun(testValue):
power = 20
for i in range(0, 10):
z = testValue / (10**i)
print("Iteration: "+str(i)+" , z: "+str(z))
if ( z == 0 ):
power = i
break
return power
print testfun(9000)
答案 2 :(得分:0)
您只需检查z<1
而不是z<=0
。这也适用于C。
def testfun(testValue):
power = 20
for i in range(0, 10):
z = testValue/(10.0**i)
print("Iteration: "+str(i)+" , z: "+str(z))
if ( z < 1 ):
power = i
break
return power
print(testfun(9000))
结果:
Iteration: 0 , z: 9000.0
Iteration: 1 , z: 900.0
Iteration: 2 , z: 90.0
Iteration: 3 , z: 9.0
Iteration: 4 , z: 0.9
4
如果您使用//
代替/
,则会产生:
Iteration: 0 , z: 9000.0
Iteration: 1 , z: 900.0
Iteration: 2 , z: 90.0
Iteration: 3 , z: 9.0
Iteration: 4 , z: 0.0
4