2016-09-27 2 views
1

Мне нужна помощь. Я пытаюсь сделать мой цикл работы с десятичными знаками, но мой код не будет принимать поплавки, и я не уверен, что делать дальше. Может ли кто-нибудь указать, где я ошибся?Можете ли вы использовать поплавок в этом цикле?

Это код, используемый для преобразования Цельсия в Фаренгейт по шагам (Дельта), которые пользователь определяет. Вот оно:

def main(): 

    # Handshake 
    print("This program will convert a range of Celsius degrees to") 
    print("Fahrenheit degrees based on your input.") 

    # Ask and read low end of range 
    Rangelow = eval(input("Enter the low end of your range: ")) 

    # Ask and read top end of range 
    Rangehigh = 1 + eval(input("Enter the high end of your range: ")) 

    # Ask and read Delta 
    Delta = eval(input("Enter the Delta for your range: ")) 

    #Display output 
    print("Celsius to Fahrenheit by", Delta) 
    for i in range(Rangelow, Rangehigh, Delta): 
     print(i, "    ", 9/5 * i + 32) 



main() 

Это пример того, что я имею в виду:

Эта программа преобразует диапазон градусов Цельсия до градусов по Фаренгейту на основе вашего ввода. Введите нижний конец вашего диапазона: 3,8 Введите высокий конец вашего диапазона: 14,7 Введите дельту для диапазона: 1.1 Цельсия в градусы Фаренгейта на 1,1 TraceBack (самый последний вызов последнего): Файл «C: \ Пользователи \ jarre \ Desktop \ Python Programs \ Conversion.py ", строка 27, в main() Файл« C: \ Users \ jarre \ Desktop \ Python Programs \ Conversion.py », строка 22, в основном для i in range (Rangelow, Rangehigh + 1, Delta): ТипError: 'float' объект не может быть интерпретирован как целое число

Я должен отметить, что проблема, похоже, связана с вводом, после запятой после вход был преобразован.

+1

Когда вы говорите, что «мой код не принимает поплавки», что это значит? Если есть трассировка, отредактируйте свой вопрос и добавьте его. – Gerrat

+0

Проверьте документы: https: //docs.python.org/2/library/functions.html ... 'Аргументы должны быть целыми числами. ' – blacksite

+1

Боковое примечание. Пожалуйста, не используйте' eval' для пользователя поставляемый вход. Если вы ожидаете 'float', используйте' float' вместо 'eval'. Если вы хотите разрешить 'int' или' float' (или любой литерал Python), вы можете использовать ['ast.literal_eval'] (https://docs.python.org/3/library/ast.html#ast. literal_eval), который будет безопасно обрабатывать произвольные литералы Python, не открывая вас для выполнения произвольного кода. – ShadowRanger

ответ

2

Вы не можете использовать встроенные делать приращения поплавка/десятичные, но это довольно легко построить свой собственный генератор:

def decimal_range(start, stop, increment): 
    while start < stop: # and not math.isclose(start, stop): Py>3.5 
     yield start 
     start += increment 

for i in decimal_range(Rangelow, Rangehigh, Delta): 
    ... 

Или вы могли бы использовать numpy, но это чувствует, как кувалда растрескивания гайки :

import numpy as np 
for i in np.arange(Rangelow, Rangehigh, Delta): 
    ... 
+0

Примечание: Это не будет вести себя так, как вы ожидаете, если вы будете использовать его с 'float' во многих случаях. Например, если аргументы равны «0.2, 0.3, 0.1', вы получите один результат (правильно исключая« примерно 0,3 »вывода). Но если вы передадите его «0.7, 0.8, 0.1', вы получите два выхода для« 0.7 »и« 0.7999999999999 ... ». Как следует из названия, единственным безопасным способом использования этого было бы преобразование входных строк непосредственно в 'decimal.Decimal', а не' float'. – ShadowRanger

+0

Да, ошибки округления округлых точек - проблема. Согласитесь, что Decimal - это путь. Вы можете использовать 'math.isclose()' для исправления некоторых ошибок для Py> 3.5 – AChampion

+0

Как бы это реализовать? Мне сложно понять это – Jarbcd