2016-09-23 84 views
1

我最近就遇到了这个在Python 3.5:int()不适用于浮动?

>>> flt = '3.14' 
>>> integer = '5' 
>>> float(integer) 
5.0 
>>> float(flt) 
3.14 
>>> int(integer) 
5 
>>> int(flt) 
Traceback (most recent call last): 
    File "<pyshell#7>", line 1, in <module> 
    int(flt) 
ValueError: invalid literal for int() with base 10: '3.14' 

这是为什么?它似乎应该返回3。我做错了什么,或者这是否有很好的理由?

+1

重要的一点:如果你不分配'float(flt)'的结果,例如'flt = float(flt)',那么转换后的值将被丢弃。它并没有在原地改变它的参数(Python没有相当于C++传递引用的概念,它允许这样做),所以'int(flt)'在原始的'str'上运行,而不是'float' 。基本上,'int()'用'float's可以很好地工作,但是你没有给它一个'float'。 – ShadowRanger

回答

5

int()预计包含一个整数文字的数字或字符串。每Python 3.5.2文档:

如果X不是数字或如果给定,然后X必须是一个字符串,bytes,或bytearray实例表示整数在基数字面基地。 (强调添加)

含义int()只能转换包含整数的字符串。您可以轻松地做到这一点:

>>> flt = '3.14' 
>>> int(float(flt)) 
3 

这将flt转换成浮动,然后将其有效期为int(),因为它是一个数字。然后它将通过删除小数部分转换为整数。

+0

谢谢你的回答,但为什么呢?它似乎应该工作。我明白,Python不会让你这样做,但它似乎很奇怪。 – nedla2004

+0

@ nedla2004有一个'int'和'float'函数的原因。 “int”用于整数转换,“float”用于浮点转换。 'float'不能就地转换。 – Li357

+0

谢谢,现在更有意义。 – nedla2004

3

它不起作用,因为flt不是整数的字符串表示。您需要先将其转换为float,然后再将其转换为int

例如

flt = '3.14' 
f = int(float(flt)) 

输出是

3 
0

其他的答案已经给你一个很好的解释关于您的问题,另一种方式来了解发生了什么事情会做这样的事情:

import sys 

for c in ['3.14', '5']: 
    try: 
     sys.stdout.write(
      "Casting {0} {1} to float({0})...".format(c, c.__class__)) 
     value = float(c) 
     sys.stdout.write("OK -> {0}\n".format(value)) 
     print('-' * 80) 
    except: 
     sys.stdout.write("FAIL\n") 

    try: 
     sys.stdout.write(
      "Casting {0} {1} to int({0})...".format(c, c.__class__)) 
     value = int(c) 
     sys.stdout.write("OK -> {0}\n".format(value)) 
    except: 
     sys.stdout.write("FAIL\n") 
     sys.stdout.write("Casting again using int(float({0}))...".format(value)) 
     value = int(float(c)) 
     sys.stdout.write("OK -> {0}\n".format(value)) 
     print('-' * 80) 

,输出:

Casting 3.14 <class 'str'> to float(3.14)...OK -> 3.14 
-------------------------------------------------------------------------------- 
Casting 3.14 <class 'str'> to int(3.14)...FAIL 
Casting again using int(float(3.14))...OK -> 3 
-------------------------------------------------------------------------------- 
Casting 5 <class 'str'> to float(5)...OK -> 5.0 
-------------------------------------------------------------------------------- 
Casting 5 <class 'str'> to int(5)...OK -> 5