2015-09-08 2 views
1

Мой код не работает, как я ожидал бы, если одна переменная float имеет 5 цифр, другие - 4, а на них выполняется арифметическая операция. Например:Выполнение арифметики по значениям с плавающей запятой разных размеров

def capacity(self): 

    mmax = self.mmax.get() 
    current = self.current.get() 
    mmin = self.mmin.get() 

    flag = False 

    if flag is False: 
     if mmax.isdigit() and mmin.isdigit() and current.isdigit(): 
      capacity = float(100 * ((float(current) - float(mmin))/(float(mmax) - float(mmin)))) 
      if mmin <= current <= mmax and 0 <= capacity <= 100: 
       flag = True 
      else: 
       self.result = str("Please ensure the values entered correspond to the correct value.") 
     else: 
      self.result = str("Please enter only positive integers.") 

    if flag is True: 
     self.result = "Capacity: %2.2f" % capacity + '%' 

Если mmax = 10000, current = 5000, and mmin = 1000, self.result = str("Please ensure...").
Если mmax = 9999, current = 5000, and mmin = 1000, self.result = str("Capacity: 44.45%).

Что здесь происходит/как я могу решить эту проблему?

+0

Это много 'float's ... Вы можете уточнить, что вы ожидали? Также отметим, что, например, 'if not flag:' предпочтительнее 'if флаг False:', поскольку он лучше подходит для значений false-y, которые * не являются * 'False'. – jonrsharpe

+0

Вы должны проверить значения, которые вы ожидаете, для 'mmax',' current' и 'mmin'. Если я просто заставляю их быть 10000, 5000 и 1000, это дает правильный результат. – spectras

+0

@spectras. Это был вопрос о том, что я получаю 'mmax',' current' и 'mmin' из записи tkinter, которая возвращает строки, и я делал арифметику непосредственно на них перед преобразованием в float/integer. @jonrsharpe Дулей отметил. –

ответ

2

Я предполагаю, что mmin и current и mmax - это строки. В этом случае это выражение:

if mmin <= current <= mmax and 0 <= capacity <= 100: 

... Выполняет лексикографическое сравнение значений. Это отличается от численного сравнения: например, "5000" < "10000" оценивает значение False, потому что «5» больше, чем «1».

Преобразуйте свои значения в номера перед выполнением сравнений на них.

if mmax.isdigit() and mmin.isdigit() and current.isdigit(): 
    mmax = float(mmax) 
    current = float(current) 
    mmin = float(mmin) 

    capacity = float(100 * ... #etc 

Или

if float(mmin) <= float(current) <= float(mmax) and 0 <= capacity <= 100: 
+0

Мы не знаем наверняка до тех пор, пока вы не получите обратную связь от адекатора, но, учитывая симптомы, это кажется отличным уловом с исправлением. + 1-ing – spectras

+0

Тег 'tkinter' является дополнительным ключом, потому что' get() 'чаще всего является методом ящиков ввода Tkinter и возвращает строку. – Kevin

+0

Кроме того, вызов 'isdigit' даст синтаксическую ошибку, если бы они были числами. – saulspatz

Смежные вопросы