在 Python 中将字符串转换为带小数的整数
Posted
技术标签:
【中文标题】在 Python 中将字符串转换为带小数的整数【英文标题】:Convert a string to integer with decimal in Python 【发布时间】:2010-11-08 20:17:45 【问题描述】:我在 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,而不需要不必要的类型转换或操作。
【问题讨论】:
马特,23.45678 不是整数。如果您希望 Python 将字符串转换为整数,请确保给它一个整数。关于什么是“正确”的事情可以用任何一种方式进行争论,最终有人会不高兴。 【参考方案1】:我认为这是一个应该在 Python 中纠正的无用错误。
int('2')
--> 2 将字符串 '2' 转换为整数 2。
int(2.7)
--> 2 将浮点数转换为整数。
int('2.7')
应该转换为 2。例如,这就是 Perl 的工作原理。是的,这同时做两件事。它转换字符串,当它发现它是一个浮点表示时,它应该转换为 int。
否则,为什么坚持float('2')
应该工作?它是一个整数字符串,因为没有小数点。所以它必须从整数字符串直接转换为浮点数。
我不知道,但也许有人可以回答是否python解释器,如果使用了所需的int(float(x))
,它是否真的经历了先转换为float然后再转换为int的过程。这将使这个错误更加需要纠正。
【讨论】:
【参考方案2】:你可以使用:
s = '23.245678'
i = int(float(s))
【讨论】:
【参考方案3】:如果要截断值,别人提到的表达式int(float(s))
是最好的。如果你想要舍入,如果舍入算法与你想要的匹配,则使用int(round(float(s))
(请参阅round documentation),否则你应该使用Decimal
,如果它的舍入算法则使用一个。
【讨论】:
【参考方案4】:round(float("123.789"))
会给你一个整数值,但是一个浮点类型。然而,使用 Python 的鸭子类型,实际类型通常不是很相关。这也将舍入您可能不想要的值。将 'round' 替换为 'int',你将得到它只是截断和一个实际的 int。像这样:
int(float("123.789"))
但是,同样,实际的“类型”通常并不那么重要。
【讨论】:
【参考方案5】:>>> s = '23.45678'
>>> int(float(s))
23
>>> int(round(float(s)))
23
>>> s = '23.54678'
>>> int(float(s))
23
>>> int(round(float(s)))
24
您没有指定是否要四舍五入...
【讨论】:
【参考方案6】:“转换”仅在您从一种数据类型更改为另一种数据类型而不损失保真度时才有意义。字符串表示的数字是浮点数,强制转换为int会失去精度。
您可能想要四舍五入(我希望这些数字不代表货币,因为这样四舍五入变得更加复杂)。
round(float('23.45678'))
【讨论】:
【参考方案7】:你想要什么样的舍入行为?你是2.67变成3,还是2。如果你想用四舍五入,试试这个:
s = '234.67'
i = int(round(float(s)))
否则,就这样做:
s = '234.67'
i = int(float(s))
【讨论】:
【参考方案8】:这个怎么样?
>>> s = '23.45678'
>>> int(float(s))
23
或者……
>>> int(Decimal(s))
23
或者……
>>> int(s.split('.')[0])
23
恐怕它会变得比这简单得多。接受它并继续前进。
【讨论】:
记住import decimal
然后将其用作decimal.Decimal(5)
或将from decimal import Decimal
用作Decimal(5)
。我总是忘记。
您应该注意每个选项提供的值的舍入类型。以上是关于在 Python 中将字符串转换为带小数的整数的主要内容,如果未能解决你的问题,请参考以下文章