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

在 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 类型,而不需要进行不必要的类型转换或操纵。

270615 次浏览

这个怎么样?

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

或者..。

>>> int(Decimal(s))
23

或者..。

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

恐怕没有比这更简单的了,接受现实,继续生活吧。

你可以用:

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

你想要什么样的舍入行为?你是2.67变成3还是2。如果你想使用舍入,试试这个:

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

否则,就这么做:

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

“转换”只有在从一种数据类型转换到另一种数据类型时才有意义,而不会失去保真度。字符串表示的数字是浮点数,一旦被强制转换为整型数,就会失去精度。

你可能想要四舍五入(我希望这些数字不代表货币,因为四舍五入会变得更加复杂)。

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

你没说要不要四舍五入。

round(float("123.789"))

会给你一个整数值,但是一个浮点类型。然而,对于 Python 的 Duck 类型,实际的类型通常并不十分相关。这也将四舍五入的值,这可能是您不想要的。把‘ round’替换成‘ int’,你会得到一个实际的 int。像这样:

int(float("123.789"))

但是,实际的“类型”通常并不那么重要。

如果要截断值,其他人提到的表达式 int(float(s))是最好的。如果你想四舍五入,使用 int(round(float(s))如果四舍五入算法匹配你想要的(见 圆形文件) ,否则你应该使用 Decimal和一如果其四舍五入算法。

我相信这是一个无用的错误,应该在 Python 中更正。

将字符串“2”转换为整数2。

将浮点数转换为整型数。

int('2.7')应该转换为2。例如,Perl 就是这样工作的。是的,这东西能同时做两件事。它转换字符串,当它发现它在一个浮点表示中时,它应该转换为 int。

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

我不知道,但也许有人可以回答是否 Python 解释器,如果使用了所需的 int(float(x)),如果它实际上经历了首先转换为 float 然后转换为 int 的过程。这将使得这个错误更加需要纠正。