Python:将float 1.0返回为int 1,但将float 1.5返回为float 1.5

时间:2019-04-04 07:46:16

标签: python floating-point integer

在Python中,有一种方法可以将1.0转换为整数1,而同一函数将忽略1.5并将其保留为float

现在,int()会将1.0变成1,但也会将1.5向下舍入到1,这不是我想要的。< / p>

10 个答案:

答案 0 :(得分:79)

从上面的评论继续:

使用is_integer()

docs 中的示例:

>>> (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)))

OR

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]

答案 1 :(得分:32)

如果您的目标是将数字转换为简洁的字符串,则可以简单地将formatting使用'%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'

答案 2 :(得分:13)

float.is_integer是浮点数的一种方法,该方法返回浮点数是否表示整数。

您可以只使用我创建的名为to_int的函数,该函数使用is_integer来检查它是否表示整数(例如1.0)(例如1.5

如果它代表整数,则返回int(a),否则只需返回其原始值。

如您所见,我没有使用elifelse,因为return仅返回一次:<​​/ p>

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

答案 3 :(得分: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

通常,如果要检查浮点是否为==的东西,则这往往是代码味道,因为浮点值本质上是近似的。通常,检查浮标是否在某个epsilon范围内的某物附近是否更合适。

答案 4 :(得分:0)

数字列表:

<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
  <persistence-unit name="pu" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>entity.E1</class>
    <class>entity.E2</class>
    <class>entity.E3</class>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:derby:memory:myTestDB;create=true"/>
      <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
      <property name="eclipselink.logging.level" value="WARNING"/>
      <property name="eclipselink.canonicalmodel.subpackage" value="test"/>
      <property name="javax.persistence.schema-generation.database.action" value="create"/>
    </properties>
  </persistence-unit>
</persistence>

一个号码:

Properties properties = new Properties();
properties.put("javax.persistence.jdbc.url", "<value>");
properties.put("eclipselink.logging.level", "<value>");
....
emf = Persistence.createEntityManagerFactory("pu", properties);

答案 5 :(得分:-1)

您可以做的一件简单的事情是使用模运算符:

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 :(得分:-2)

我过去在C ++中曾经做过的事情,是说您拥有以下变量:

apt install fonts-droid-fallback ttf-dejavu fonts-freefont-ttf fonts-liberation ttf-ubuntu-font-family

然后您可以执行以下操作:

apk add ttf-dejavu ttf-droid ttf-freefont ttf-liberation ttf-ubuntu-font-family

这将返回0,因为1.5不等于1

float x = 1.5;
float y = 1.0;

这将返回1,因为1.0等于1

当然,您的问题是关于Python的,而功能if(x == (int)x) return 1; else return 0; 应该很好用,我只是认为有些人可能会觉得有用。

答案 7 :(得分:-2)

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

答案 8 :(得分:-2)

要回答的问题,需要比较浮点值。必须始终避免对浮点数进行相等运算。某种形式的舍入是一种有效的方法。

但是对于这种用例,decimals module是您的朋友。与浮点数相比,小数对问题中引用的值具有绝对准确性的优点,并且在比较操作中也可以获得完全可靠的结果。

答案 9 :(得分:-2)

divmod替代:

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