在Python中,有一种方法可以将1.0
转换为整数1
,而同一函数将忽略1.5
并将其保留为float
?
现在,int()
会将1.0
变成1
,但也会将1.5
向下舍入到1
,这不是我想要的。< / p>
答案 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))
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)
,否则只需返回其原始值。
如您所见,我没有使用elif
或else
,因为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)