Python,版本 3.5
我有以下代码:
def drange(start, stop, step):
r = start
while r < stop:
yield r
r += step
def my_func():
whole_nums = [float(num) for num in range(0, 100)]
for x in drange(0.0, 100.01, 0.01):
if str(x).split('.')[1] == '0':
x = str(x).split('.')[0]
else:
x = round(x, 2)
print(str(x))
time.sleep(0.2)
该drange
函数以给定的增量循环遍历给定的数字并产生这些数字。问题是我想要 0、1、2、3 等,但它会产生 0.0、1.0 等等。
我想,既然我知道这些错误数字的格式(介于 0.01 之间的所有其他数字,一直到我想要的 99.99),我可以这样做:
str(theNumber).split('.')[1]
(如my_func
),如果输出是,'0'
那么我会知道我有 0.0、1.0 等,并且可以获取我想要的输出str(theNumber).split('.')[0]
,当然还可以将其转换为 int 或其他类型。
但!当我执行时my_func
,该.split()
解决方案仅适用于 0.0,当它达到 1.0 时,它只是跳过if
语句并进入else
,打印出 1.0 而不是 1。
代码应该可以在不导入任何内容的情况下正常运行,所以请随意尝试一下。
好吧,看来我的方法从根本上是有缺陷的(请参阅@danils 的答案),所以我现在的问题是:如何以 0.01 为增量生成 0 到 100 之间的数字,同时确保整数是整数。所以
0, 0.01, ..., 1, 1.01, 1.1, 1.02, ... 99.5, 99.51, ..., 100
你永远不应该依赖浮点整数的字符串表示,因为它们很少有精确的表示(近似导致精度不准确,这会导致工作中的扳手)。
你不需要str(x)
到print
,因为print
自动完成,对你。
此外,您的drange
函数似乎在逐步生成下一个值时引入了浮点误差。您可以改为使用np.arange
范围,它支持十进制步长:
import numpy as np
out = np.arange(0.0, 100.01, 0.01)
print(out)
array([ 0.00000000e+00, 1.00000000e-02, 2.00000000e-02, ...,
9.99800000e+01, 9.99900000e+01, 1.00000000e+02])
注意:如果没有numpy
,可以使用pip install numpy
.
最后,您可以float.is_integer
用来检查浮点数是否为整数。
for x in np.arange(0.0, 100.01, 0.01):
if x.is_integer():
x = int(x)
else:
x = round(x, 2)
print(x)
这给你:
0
0.01
0.02
0.03
0.04
0.05
0.06
0.07
0.08
0.09
0.1
...
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句