为什么不能转换" 1.7"直接转换为整数,而不先转换为浮点数?

时间:2015-10-13 22:52:16

标签: python floating-point integer type-conversion coercion

当我输入int("1.7")时,Python返回错误(特别是ValueError)。我知道我可以通过int(float("1.7"))将其转换为整数。我想知道为什么第一种方法会返回错误。

4 个答案:

答案 0 :(得分:9)

来自documentation

  

如果x不是数字或者给定了base,那么x必须是一个字符串或Unicode对象,表示以radix为基础的整数文字......

显然,linux不代表基数的整数文字。

如果你想知道为什么 python dev决定将自己限制在基数的整数文字中,可能有无数的原因,你必须问圭多等。我肯定知道。一个猜测是易于实施+效率。您可能认为他们很容易将其实现为:

  1. 将数字解释为浮动
  2. 截断为整数
  3. 不幸的是,这在python中不起作用,因为整数可以具有任意精度,而浮点数则不能。特殊的套管大数可能会导致普通案例 1 效率低下。

    此外,强制您执行"1.7"还有明显的额外好处 - 它使输入字符串可能看起来更加明显,这有助于在其他地方进行调试。事实上,我可能会争辩说,即使int(float(...))接受int之类的字符串,最好还是为了提高代码清晰度而编写"1.7"

    1 假设有一些验证。其他语言跳过此 - 例如int(float("1.7"))将评估ruby并为您提供'1e6'.to_i,因为它会停止在第一个非整数字符处进行解析。似乎这可能导致有趣的错误追踪......

答案 1 :(得分:2)

我们有一个很好的,明显的想法是什么“从这个浮点数中取出一个int”意味着因为我们将浮动视为两个部分,我们可以抛弃其中一个。

当我们有一个字符串时,它不是那么明显。将这个字符串变成浮点数意味着关于字符串内容的各种微妙的事情,这不是一个理智的人想要在代码中看到的值不明显的东西。

所以简短的回答是:Python喜欢明显的东西并且不鼓励魔术。

答案 2 :(得分:1)

这里有一个很好的描述,为什么你不能在python文档中找到它。

https://docs.python.org/2/library/functions.html#int

  

如果x不是数字或者给定了base,则x必须是表示基数为整数的字符串或Unicode对象。可选地,文字可以在前面加+或 - (之间没有空格)并且用空格包围。 base-n文字由数字0到n-1组成,a到z(或A到Z)的值为10到35.默认基数为10.允许的值为0和2-36。 Base-2,-8和-16文字可以选择以0b / 0B,0o / 0O / 0或0x / 0X作为前缀,与代码中的整数文字一样。基数0表示将字符串完全解释为整数字面值,因此实际基数为2,8,10或16。

基本上要将字符串转换为字符串中的整数,字符串不能包含“。”

答案 3 :(得分:1)

向后兼容性 肯定是可能的,但是这将是一个糟糕的主意,因为它会向后兼容 - 依赖于尝试的古老而成熟的Python习惯用法......除了梯形图( “更容易请求宽恕而非许可”)来确定字符串内容的类型。至少从Python 1.5,AFAIK开始使用这个成语;这里有两个引文:[1] [2]

s = "foo12.7"
#s = "-12.7"
#s = -12

try:
    n = int(s) # or else throw an exception if non-integer...
    print "Do integer stuff with", n
except ValueError:
    try:
        f = float(s) # or else throw an exception if non-float...
        print "Do float stuff with", f
    except ValueError:
        print "Handle case for when s is neither float nor integer"
        raise # if you want to reraise the exception

另一个小问题:这不仅仅是数字是否包含'。'科学记数法或任意字母也可以打破字符串的内涵。 示例:int("6e7")不是整数(基数为10)。但是int("6e7",16) = 1767是基数为16的整数(或任何基数> = 15)。但int("6e-7")永远不是一个整体。

(如果你将基数扩展到base-36,任何合法的字母数字字符串(或Unicode)都可以被解释为表示一个整数,但默认情况下这样做通常是一种可怕的行为,因为“dog”或“cat” “不太可能是对整数的引用。”