【问题标题】:Why does int(float(str)) work but int(str) not work为什么 int(float(str)) 有效但 int(str) 无效
【发布时间】:2018-12-29 17:33:59
【问题描述】:

假设我有一个字符串:

temp = "0.1"

当我运行int(temp):

我收到以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '0.1'

但是当我运行int(float(temp)):

我得到正确的输出,即0


为什么转换成float再转换成int有效,而直接转换成int无效?

感谢和问候

【问题讨论】:

  • 因为字符串中的值不是整型变量,而是floating-point变量。
  • @Azhy 但是 float(temp) 中的值也是一个浮点变量
  • 是的,但它在一个字符串中,当前不是浮点变量。
  • @Azhy Ahhh... 现在我明白了

标签: python type-conversion int


【解决方案1】:

这是因为您的字符串具有浮点格式。因此,当您直接将“0.1”转换为 int 时,它会返回错误。但是如果你转换为 float 并在转换为 int 之后,它可以截断你的数字。

【讨论】:

  • 但是为什么不能直接截断一个字符串
  • 因为 int() 无法将“0.1”识别为数字。
  • 但是,在这种情况下,float() 可以识别。
  • 但是 int 可以将 float("0.1") 识别为数字?
  • 是的,因为 float() 将这个字符串转换为数字,而 int() 截断后只得到整数部分。
【解决方案2】:

这是documented 的行为(强调我的):

如果x 是数字,它可以是普通整数、长整数或浮点数。如果x 是浮点数,则转换向零截断

如果x 不是数字或如果base 给出,则x 必须是字符串或Unicode 对象表示整数字面量 基数base

至于你的问题为什么,唯一的答案是:因为它是这样设计的。

【讨论】:

    【解决方案3】:

    来自pythondocs

    如果 x 不是数字或给出了 base,则 x 必须是字符串、字节或 bytearray 实例,表示以基数为基数的整数文字。可选地,文字可以在前面加上 + 或 - (中间没有空格)并被空格包围。 base-n 文字由数字 0 到 n-1 组成,a 到 z(或 A 到 Z)的值是 10 到 35。默认基数是 10。允许的值是 0 和 2-36。 Base-2、-8 和 -16 文字可以选择以 0b/0B、0o/0O 或 0x/0X 作为前缀,就像代码中的整数文字一样。

    那么 x 必须是表示整数的字符串、字节或字节数组实例 因此,如果您将 . 添加到字符串中,它将不再代表整数

    【讨论】:

      【解决方案4】:

      如果您将字符串传递给int,则仅当字符串直接表示整数时才有效。如果字符串表示非整数,则它不起作用。但是如果你将浮点数传递给int,它总是可以通过截断浮点数来工作。 int 只是不接受“可以通过首先将它们制成浮点数然后截断它们来制成整数的字符串”;它只接受直接表示整数的字符串。这就是int 的工作原理。

      【讨论】:

        【解决方案5】:

        不同之处在于像浮点数这样的数字对象有一个特殊的__int____trunc__ 方法,可以在解析字符串时计算它们的整数值。请参阅文档中的 int()

        因此int(0.1) 的结果来自O.1 对象,int("0.1") 的结果来自int() 函数。

        【讨论】: