69

我有一个格式为: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,而不需要不必要的类型转换或操作。

4

8 回答 8

128

这个怎么样?

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

或者...

>>> int(Decimal(s))
23

或者...

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

我怀疑它会变得比这更简单,我害怕。接受它并继续前进。

于 2009-07-07T20:36:52.003 回答
15

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

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

否则,只需执行以下操作:

s = '234.67'
i = int(float(s))
于 2009-07-07T20:41:44.583 回答
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

您没有指定是否要四舍五入...

于 2009-07-07T20:47:25.867 回答
2

你可以使用:

s = '23.245678'
i = int(float(s))
于 2009-07-07T20:40:58.360 回答
2

“转换”仅在您从一种数据类型更改为另一种数据类型而不损失保真度时才有意义。字符串表示的数字是浮点数,在强制转换为 int 时会失去精度。

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

round(float('23.45678'))
于 2009-07-07T20:45:05.403 回答
1

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

于 2009-07-07T20:48:21.933 回答
0
round(float("123.789"))

会给你一个整数值,但是一个浮点类型。然而,使用 Python 的鸭子类型,实际类型通常不是很相关。这也将舍入您可能不想要的值。将 'round' 替换为 'int',你将得到它只是截断和一个实际的 int。像这样:

int(float("123.789"))

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

于 2009-07-07T20:47:26.117 回答
0

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

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

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

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

Otherwise, why insist that float('2') should work? It is an integer string, because there is no decimal point. So it has to convert from string which is an integer, directly to float.

I don't know but perhaps someone can answer whether the python interpreter, if the required int(float(x)) is used, if it actually goes through the process of first converting to float and then converting to int. That would make this bug even more critical to correct.

于 2021-11-07T17:46:32.400 回答