Python 3数组平均值计算

时间:2019-02-26 16:25:34

标签: python-3.x floating-point precision

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)

2 个答案:

答案 0 :(得分:4)

我都得到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所述,操作顺序很重要。使用纯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)

答案 1 :(得分:2)

num1/den1num2/den2用浮点算法计算。这包括将精确的数学结果四舍五入为浮点可表示的值。

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