Как принять что-то вроде "2.0" как целое число, но, например, "2.1" как float? питон
Я пытаюсь сделать так, чтобы пользователь получил сообщение об ошибке, если они ввели алфавитные буквы или нецелые числа, и когда будет введено целое число, программа продолжит показывать это целое число в квадрате и кубике. Мой учитель не хочет никаких "перерывов" в коде или каких-либо ValueErrors.
print("Squaring and cubing integer program has started") #Introduction of program for user
UserNumber=input("Enter an integer to be raised to the power of 2 and 3: ") #Asks user to input an integer, that will then be raised to the power of 2 and 3
while '.' in UserNumber or UserNumber.isalpha(): #Error-trap to test if input contained letters of the alphabet or contains decimal point
print("You have not entered an integer. Try again and enter an integer!") #Alert for user to inform that their entry was invalid (not an integer)
UserNumber=input("Enter an integer to be raised to the power of 2 and 3: ") #Asks user again to enter an integer, if they did not previously.
print(int(UserNumber), " is the integer you entered.") #Displays to user their inital integer
print(int(UserNumber), " squared is ", int(UserNumber)**2) #Displays to user their input integer squared
print(int(UserNumber), " cubed is ", int(UserNumber) **3 ) #Displays to user their input integer cubed
print("Calculations are now finished.") #Output to show program has ended
Ответы
Ответ 1
2.0
не является целым числом; это поплавок. float
в Python похож на стандартную плавучую точку IEEE 754 (если платформа поддерживает плавучую точку IEEE 754, то, вероятно, использует ее Python), которые имеют ограниченную точность. Целые числа в Python имеют бесконечную точность (до тех пор, пока у вас не закончится память):
>>> i = 123456789012345678901234567890
>>> i == 123456789012345678901234567890
True
>>> f = i * 1.0 # make it a float
>>> f.is_integer() # check whether it is a whole number
True
>>> f == 123456789012345678901234567890
False
Никогда не смешивайте float и int, если вы не знаете, что он не изменит результат в вашем случае, например, 2 == 2.0
, но, как показывает пример, он может быть ложным для больших чисел.
Ваш учитель, вероятно, ожидает, что вы найдете метод .is_integer()
:
>>> 2.0 .is_integer()
True
>>> 2.1 .is_integer()
False
См. также Как проверить, является ли значение float целым числом.
Чтобы преобразовать '2.0'
в float, вы можете вызвать функцию float()
:
#!/usr/bin/env python3
while True:
try:
f = float(input('Enter a number: '))
except ValueError:
print('Try again')
else:
break # got a number
Это правильный способ получить число из stdin в Python. Если ваш учитель запрещает использовать ValueError
и break
, вы можете использовать регулярное выражение:
if re.match("^[+-]? *(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?$", input_string):
, который принимает 20e-1 == 2.0 == 2
. См. Извлечь float/double value.
Чтобы проверить, не является ли вход не пустым и содержит только десятичные цифры, т.е. , чтобы проверить, является ли оно неотрицательным целым числом, вы можете использовать метод input_string.isdecimal()
при вызове int(input_string)
и ловле ValueError
запрещено. См. Как проверить, является ли строка числом в Python?.
Ответ 2
Вопрос OP основан на присвоении класса. Этот ответ предполагает, что решение должно соответствовать правилам, определенным учителем.
Просто избавьтесь от конечных нулей, а затем избавьтесь от конечной десятичной точки:
UserNumber = UserNumber.rstrip('0').rstrip('.')
Поместите эту строку после инструкции input
, но перед выполнением тестов:
print("Squaring and cubing integer program has started") #Introduction of program for user
UserNumber=input("Enter an integer to be raised to the power of 2 and 3: ") #Asks user to input an integer, that will then be raised to the power of 2 and 3
UserNumber = UserNumber.rstrip('0').rstrip('.')
while '.' in UserNumber or UserNumber.isalpha(): #Error-trap to test if input contained letters of the alphabet or contains decimal point
print("You have not entered an integer. Try again and enter an integer!") #Alert for user to inform that their entry was invalid (not an integer)
UserNumber=input("Enter an integer to be raised to the power of 2 and 3: ") #Asks user again to enter an integer, if they did not previously.
UserNumber = UserNumber.rstrip('0').rstrip('.')
print(int(UserNumber), " is the integer you entered.") #Displays to user their inital integer
print(int(UserNumber), " squared is ", int(UserNumber)**2) #Displays to user their input integer squared
print(int(UserNumber), " cubed is ", int(UserNumber) **3 ) #Displays to user their input integer cubed
print("Calculations are now finished.") #Output to show program has ended
Ответ 3
A) Я не хочу удалять какие-либо числа. B) Я хочу проверить, является ли пользовательский ввод чем-то вроде целого числа, поэтому буквы и decmials (не десятичные числа, такие как 2.0, 1.0, равные 2,1 соответственно)
В соответствии с вашим описанием вы можете использовать модуль re
для реализации вашей работы:
import re
def is_integer(num):
s = str(num)
return re.match('^(-?\d+)(\.[0]*)?$', s) is not None
print is_integer(1123123) # True
print is_integer(1123123.) # True
print is_integer(1123123.00000) # True
print is_integer(1123123.00100) # False
Ответ 4
x = 2.0
try:
x = int(x)
except ValueError:
pass
return x
Это единственный приемлемый способ в Python, если ваш учитель не понимает исключений, он не должен преподавать программирование на Python (честно говоря, он вообще не должен преподавать программирование)