在Python中将带有小数的字符串转换为整数

78
我有一个在Python中的字符串,格式为:'nn.nnnnn',我想将其转换为整数。 直接转换会失败:
>>> s = '23.45678'
>>> i = int(s)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '23.45678'

我可以使用以下方式将其转换为十进制:

>>> from decimal import *
>>> d = Decimal(s)
>>> print d
23.45678

我也可以按'.'进行分割,然后将小数从零中减去,再加上整数部分...哎呀。

但我更愿意将其作为int类型,避免不必要的类型转换或操作。


15
Matt,23.45678不是整数。如果你想让Python将一个字符串转换为整数,请确保你提供的是一个整数。对于什么是“正确”的事情,可以有不同的观点,最终会有人感到不满意。 - Christopher
8个回答

145

这个怎么样?

>>> s = '23.45678'
>>> int(float(s))
23

或者...

>>> int(Decimal(s))
23

或者...

>>> int(s.split('.')[0])
23

我怀疑这件事不会比那更简单,恐怕只能接受并继续前进。


6
记得要import decimal,然后使用 decimal.Decimal(5),或者使用 from decimal import Decimal,然后使用 Decimal(5)。我经常忘记。 - teewuane
你应该注意每个选项提供的舍入类型。 - Rapnar
请注意,s.split('.')选项不会像其他选项那样拒绝和解释错误的输入字符串。在最好的情况下,您可能会得到糟糕的错误消息,在最坏的情况下可能会得到可疑的结果。 - julaine

16

你需要什么样的四舍五入行为?你想把2.67变成3还是变成2?如果你想使用四舍五入,请尝试以下代码:

s = '234.67'
i = int(round(float(s)))

否则,只需执行:

s = '234.67'
i = int(float(s))

4
>>> s = '23.45678'
>>> int(float(s))
23
>>> int(round(float(s)))
23
>>> s = '23.54678'
>>> int(float(s))
23
>>> int(round(float(s)))
24

您没有说明是否需要四舍五入...


3

您可以使用以下方法:

s = '23.245678'
i = int(float(s))

2

只有在不失真的情况下从一种数据类型转换到另一种数据类型时,“转换”才有意义。该字符串表示的数字是浮点数,在强制转换为整数时将失去精度。

你可能想要进行四舍五入,但如果这些数字代表货币,那么四舍五入就会变得更加复杂。

round(float('23.45678'))

1
其他人提到的表达式int(float(s))是最好的选择,如果你想截断值。如果你想要四舍五入,使用int(round(float(s)),如果圆整算法符合你的要求(参见round documentation),否则你应该使用Decimal和它的一个圆整算法。

0
round(float("123.789"))

将会给你一个整数值,但是是浮点类型。然而,使用Python的鸭子类型,实际类型通常并不是很重要。这也会四舍五入该值,这可能不是你想要的。将 'round' 替换为 'int',你就可以得到截断后的实际整数。像这样:

int(float("123.789"))

但是,再次强调,实际上“类型”通常并不那么重要。


0

我认为这是一个无用的bug,应该在Python中进行修正。

int('2') --> 2 将字符串'2'转换为整数2。

int(2.7) --> 2 将浮点数转换为整数。

int('2.7') 应该转换为2。例如,Perl就是这样工作的。是的,它同时执行两件事。它将字符串转换成整数,并且当它发现它在一个浮点表示中时,它应该转换为整数。

否则,为什么要坚持float('2')能够工作呢?它是一个整数字符串,因为没有小数点。所以它必须将字符串从整数直接转换为浮点数。

我不知道,但也许有人可以回答:如果使用所需的int(float(x)),Python解释器是否实际上会先转换为浮点数,然后再转换为整数。这将使这个bug更加需要及时修复。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接