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)
答案 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/den1
和num2/den2
用浮点算法计算。这包括将精确的数学结果四舍五入为浮点可表示的值。
结果是avgc1
和avgc2
可能与理想数学值不同,因此它们的商也不同。