我在python上运行以下代码来打印nos。在为浮动编号指定的范围内:
def float_range(begin,end,step):
i=begin-step
numbers=[]
while i!=end:
i=i+step
numbers.append(i)
return numbers #returning the list
a=2
b=4
c=.1
for j in float_range(a,b,c): #calling function
print j
它会出现以下错误
Traceback (most recent call last):
File "C:\Users\b53659\Desktop\My python\float_range.py", line 13, in <module>
for j in float_range(a,b,c):
File "C:\Users\b53659\Desktop\My python\float_range.py", line 7, in float_range
numbers.append(i)
MemoryError.
但在上面的代码中如果我替换
a=1
b=1000
c=1
它给出正确的输出,即打印否。从1到1000。 为什么会这样?提前谢谢
答案 0 :(得分:2)
问题是您正在使用c=.1
,这会使计数器成为浮点数。当循环进入结束时#39; (在float_range
)中,我将是4.00000000001
或3.9999999999998
,因此它不会与整数4进行比较。
有几种可能的解决方案:
decimal.Decimal
类)i < end
而不是i!=end
答案 1 :(得分:1)
你应该做这样的事情
def float_range(begin,end,step):
i = begin-step
numbers = []
while i < end:
i += step
numbers.append(i)
return numbers #returning the list
for j in float_range(2,4,0.1): #calling function
print round(j, 2)
这样,即使浮点数没有达到确切的整数值,您也可以确保循环在end
之上停止。
除了while i < end:
之外,我还做了两个其他的更改。您可以使用+=
代替i = i+step
。我还将花车向下弄圆了,因为如果你不这样做,它会打印3.9000000000000017
之类的东西。
我希望这会有所帮助。
答案 2 :(得分:0)
代码中的主要缺陷是while condition !=
。
您正在检查是否i!=end
。这里的步骤是0.1,实际上是0.100000000000001。所以当你达到最后一次迭代时(根据你的逻辑)
i = 3.9 + step = 4.000000001
你有end= 4.0
和i!=end
所以你的while loops condition i!=end is True always
和循环会永远继续并抛出内存错误
我已经调试了代码并在列表中找到了实际值。您可以从屏幕截图中看到,4.0
值从未生成,而是生成4.0000001
此代码可以按预期工作:
def float_range(begin,end,step):
i=begin-step
numbers=[]
while i < end:
i=i+step
numbers.append(i)
return numbers #returning the list