Как принять что-то вроде "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 (честно говоря, он вообще не должен преподавать программирование)