2016-03-18 12 views
5

サイエンティフィック表記の数字は常にfloatと読み込まれますが、 '1e400'のような文字列をintfloatでは大きすぎます)に変換するにはどうすればよいですか?私が知っているなぜ1e400はintではありませんか?

>>>int('1e400') 
ValueError: invalid literal for int() with base 10: '1e400' 
>>>int(float('1e400')) 
OverflowError: cannot convert float infinity to integer 

、私のような機能を行うことができます。

def strtoint(string): 
    parts = string.split('e') 
    if len(parts) == 1: 
    return int(string) 
    elif len(parts) == 2: 
    if int(parts[1])<0: 
     return int(string) 
    return int(parts[0])*10**int(parts[1]) 
    else: 
    return int(string) #raise a error if the string is invalid, but if the variable string is not a string, it may have other way to convert to an `int` 

しかし、これではない非常に神託の方法、より良い方法はありますか?

+0

可能な複製http://stackoverflow.com/questions/32861429/converting-number-in-scientific-notation-to-int? – snakecharmerb

+1

@ snakecharmerbその質問に対する答えはすべて、数値が 'float'の範囲内にあると仮定しますが、この質問は明示的にはそうではないと言います。 –

+0

なぜ 'e'表記法が常に浮動小数点として扱われるかは、構文がそのように定義されているからです。それを変更するために何もできません。 –

答えて

8

おそらく、intに変換する前に中間形式としてDecimalを使用できます。

>>> import decimal 
>>> decimal.Decimal("1e400") 
Decimal('1E+400') 
>>> int(decimal.Decimal("1e400")) 
10000000000000000000000000000000000000000000000000000000000000000000000000000000 
00000000000000000000000000000000000000000000000000000000000000000000000000000000 
00000000000000000000000000000000000000000000000000000000000000000000000000000000 
00000000000000000000000000000000000000000000000000000000000000000000000000000000 
00000000000000000000000000000000000000000000000000000000000000000000000000000000 
0