Python 3阵列平均计算


x=[1280.0, 2050.0, 709.0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
num1=0
den1=0
num2=0
den2=0
for i in range(0,3):
    num1=num1+x[i]
    den1=den1+1
del i
for i in range(0,6):
    num2=num2+x[i]
    den2=den2+1
avgc1= num1/den1
avgc2= num2/den2
val = (100* avgc1 / avgc2)
print(val)

可变 val的值应为200,但我得到的199.99999999999997。有人可以帮我理解原因吗?

同时,如果我尝试以下内容,它将返回200。

y=4039.0
x1=y/3
x2=y/6
x3=100*x1/x2
print(x3)

我都为两者获得199.99999999999997(Python版本3.7.1)。问题是由于浮点算术中的舍入错误。

您可以按照@josh Friedlander所说的并使用双//,但这将导致地板划分,这可能不是您想要的。为了保持更高的精度,您可以尝试使用numpy进行除法。

import numpy as np
y=4039
x1=np.divide(y,3)
x2=np.divide(y,6)
x3=100*np.divide(x1,x2)
print(x3)

返回

200.0

也适用于您的其他情况:

x=[1280.0, 2050.0, 709.0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
num1=0
den1=0
num2=0
den2=0
for i in range(0,3):
    num1=num1+x[i]
    den1=den1+1
del i
for i in range(0,6):
    num2=num2+x[i]
    den2=den2+1
avgc1= np.divide(num1,den1)
avgc2= np.divide(num2,den2)
val = (100* np.divide(avgc1,avgc2))
print(val)

返回

200.0

这是使用np.__version__ 1.15.4进行参考。

编辑

正如@mark Dickinson所指出的,操作令很重要。用Pure Python在分区周围放置括号将导致200.0无需使用numpy

x=[1280.0, 2050.0, 709.0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
num1=0
den1=0
num2=0
den2=0
for i in range(0,3):
    num1=num1+x[i]
    den1=den1+1
del i
for i in range(0,6):
    num2=num2+x[i]
    den2=den2+1
avgc1= num1 / den1
avgc2= num2 / den2
# use parentheses to perform division first
val = (100* (avgc1 / avgc2))
print(val)

num1/den1num2/den2是用浮点算术计算的。这包括将精确的数学结果舍入到浮点数中可表示的值。

结果是avgc1avgc2可能与它们的理想数学值不同,其商也是如此。

最新更新