Python: вернуть float 1.0 как int 1, но float 1.5 как float 1.5 - программирование

Python: вернуть float 1.0 как int 1, но float 1.5 как float 1.5

В Python есть способ превратить 1.0 в целое число 1 то время как та же функция игнорирует 1.5 и оставляет его как число с float?

Прямо сейчас int() превратит 1.0 в 1 но также округлит 1.5 до 1, что мне не нужно.

4b9b3361

Ответ 1

Продолжая комментарии выше:

Использование is_integer():

Пример из документов:

>>> (1.5).is_integer()
False
>>> (1.0).is_integer()
True
>>> (1.4142135623730951).is_integer()
False
>>> (-2.0).is_integer()
True
>>> (3.2).is_integer()
False

ВВОД:

s = [1.5, 1.0, 2.5, 3.54, 1.0, 4.4, 2.0]

Отсюда:

print([int(x) if x.is_integer() else x for x in s])

Завернут в функцию:

def func(s):
    return [int(x) if x.is_integer() else x for x in s]

print(func(s))

Если вы не хотите import:

def func(s):
    return [int(x) if x == int(x) else x for x in s]

print(func(s))

Используя map() с lambda функцией и т.е. s:

print(list(map(lambda x: int(x) if x.is_integer() else x, s)))

ИЛИ ЖЕ

print(list(map(lambda x: int(x) if int(x) == x else x, s)))

ВЫХОД:

[1.5, 1, 2.5, 3.54, 1, 4.4, 2]

Ответ 2

Если ваша цель - преобразовать числа в сжатую строку, вы можете просто использовать '%g' ("Общий формат") для форматирования:

>>> '%g' % 1.0
'1'
>>> '%g' % 1
'1'
>>> '%g' % 1.5
'1.5'
>>> '%g' % 0.3
'0.3'
>>> '%g' % 0.9999999999
'1'

Вы можете указать желаемую точность:

>>> '%.15g' % 0.999999999999999
'0.999999999999999'
>>> '%.2g' % 0.999
'1'

Ответ 3

float.is_integer - это метод для чисел с плавающей точкой, который возвращает, представляет ли число с плавающей точкой целое число.

Вы можете просто использовать эту функцию, которую я назвал to_int, которая использует is_integer чтобы проверить, представляет ли она целое число (например, 1.0) или нет (например, 1.5).

Если оно представляет целое число, верните int(a), в противном случае просто верните его исходное значение.

Как видите, я не использую elif или else потому что return выходит из функции:

def to_int(a):
   if a.is_integer():
      return int(a)
   return a

print(to_int(1.5))
print(to_int(1.0))

Выход:

1.5
1

Ответ 4

Плавания Python являются приблизительными, поэтому то, что печатается как 1.0, не обязательно точно 1.0. Если вы хотите увидеть, является ли что-то приблизительно целым, используйте достаточно малое значение эпсилона.

EPSILON = 0.0001 # Make this smaller or larger depending on desired accuracy

def func(x):
  if abs(x - round(x)) < EPSILON:
    return round(x)
  else:
    return x

В общем, если вы проверяете, является ли число с плавающей точкой == для чего-либо, это имеет тенденцию быть запахом кода, поскольку значения с плавающей запятой по своей природе являются приблизительными. В целом более уместно проверить, находится ли поплавок рядом с чем-либо, в пределах некоторого эпсилон-диапазона.

Ответ 5

Простая вещь, которую вы можете сделать, это использовать оператор по модулю:

if (myFloat % 1 == 0) // Number is an int
else // numer is not an int

РЕДАКТИРОВАТЬ: код Python

if myFloat % 1 == 0:
  # myFloat is an integer.
else:
  # myFloat is NOT an integer

Ответ 6

для списка номеров:

def get_int_if_possible(list_of_numbers):
    return [int(x) if x == int(x) else x for x in list_of_numbers]

за один номер:

def get_int_if_possible(number):
    return int(number) if number == int(number) else number

Ответ 7

То, что я делал в прошлом в C++, скажем, у вас есть эти переменные:

float x = 1.5;
float y = 1.0;

Тогда вы можете сделать что-то вроде этого:

if(x == (int)x) 
    return 1;
else return 0;

Это вернет 0, потому что 1,5 не равно 1

if(y == (int)y) 
    return 1;
else return 0;

Это вернет 1, потому что 1,0 равно 1

Конечно, ваш вопрос о Python, и функция is_integer() должна работать отлично, я просто подумал, что некоторые люди могут найти это полезным.

Ответ 8

Безопасный подход с использованием lambda и is_integer():

>>> to_int = lambda x: int(x) if float(x).is_integer() else x
>>> to_int(1)
1
>>> to_int(1.0)
1
>>> to_int(1.2)
1.2
>>> 

Ответ 9

def your_function(i):
  if i.is_integer():
    return int(i)
  else:
    return float(i)

Ответ 10

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

Но для такого случая использования модуль decimals - ваш друг. Десятичные числа имеют преимущество абсолютной точности для значений, указанных в вопросе, по сравнению с числами с плавающей запятой, а также достигают абсолютно надежных результатов в операциях сравнения.

Ответ 11

альтернатива divmod:

def f(x):
    return x if divmod(x, 1)[1] else int(x)

Ответ 12

если вы ищете прямой подход без использования .is_integer()?

is_integer - это метод для float, который вы можете проверить,

dir(float) #eg dir(1.0)

будет список методов, доступных для float, включая .is_integer()

Теперь перейдем к делу...

Прямой подход:

int(float_num) -> will return int so do direct comparison 

синтаксис: int(num) == num → int(num) otherwise → num

скрипт: n = int(num) if int(num) == num else num

например:

num = 1.5
n = int(num) if int(num) == num else num
print n
>>> 1.5

Как функция,

>>> def num_con(n):
...    return int(n) if int(n) == n else n

Sample Input/output:
>>> num_con(1.0)
1
>>> num_con(1.5)
1.5
>>> num_con(2.5)
2.5
>>> num_con(2.0)
2
>>> 

так же, как список номеров,

а) одна строка:

[int(i) if int(i) == i else i for i in [1.5,2.0,3.2,4.0,5.5]]

б) повторное использование функции:

[num_con(i) for i in [1.5,2.0,3.2,4.0,5.5]]  #num_con is a function which we wrote on top