Я получаю 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)
Returns
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)
Returns
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)