2016-09-23 3 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)'は 'float'ではなく元の' str'で動作しています。基本的に、 'int()'は 'float'でうまく動作しますが、あなたは' float'を与えませんでした。 – ShadowRanger

答えて

5

int()整数リテラルが含ま数または文字列を想定しています。 Python 3.5.2ドキュメントあたり:

Xは数ではないか、塩基が与えられた場合には、X基数でリテラル整数を表す文字列、bytes、又はbytearrayインスタンスでなければならない場合ベース。 (強調が追加されました)

意味int()は、整数を含む文字列のみを変換できます。あなたは簡単にこれを行うことができます。これは、それが数であるため、その後int()に対して有効であるフロートへfltに変換します

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

。次に、小数部分を削除して整数に変換します。

+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 
関連する問題