Pythonの整数の長さ



Answers

文字列への変換なし

import math
digits = int(math.log10(n))+1

ゼロと負の数も処理するには

import math
if n > 0:
    digits = int(math.log10(n))+1
elif n == 0:
    digits = 1
else:
    digits = int(math.log10(-n))+2 # +1 if you don't count the '-' 

おそらくそれを関数に入れたいと思うでしょう:)

ここにいくつかのベンチマークがあります。 len(str())はかなり小さい数のために既に後ろにあります

timeit math.log10(2**8)
1000000 loops, best of 3: 746 ns per loop
timeit len(str(2**8))
1000000 loops, best of 3: 1.1 µs per loop

timeit math.log10(2**100)
1000000 loops, best of 3: 775 ns per loop
 timeit len(str(2**100))
100000 loops, best of 3: 3.2 µs per loop

timeit math.log10(2**10000)
1000000 loops, best of 3: 844 ns per loop
timeit len(str(2**10000))
100 loops, best of 3: 10.3 ms per loop
Question

Pythonでは、整数の桁数はどうやって調べるのですか?




>>> a=12345
>>> a.__str__().__len__()
5



以下の方法を使用すると、整数に対して素早く行うことができます。

len(str(abs(1234567890)))

"1234567890"の絶対値の文字列の長さを取得します。

absは数値を除いた数値を返し、 strはそれをstrキャスト/変換し、 lenはその文字列の文字列長を返します。

浮動小数点数を使用する場合は、次のいずれかを使用できます。

# Ignore all after decimal place
len(str(abs(0.1234567890)).split(".")[0])

# Ignore just the decimal place
len(str(abs(0.1234567890)))-1

今後の参考のために。




文字列に変換せずに、私は次のようにします:

def lenDigits(x): 
    """
    Assumes int(x)
    """

    x = abs(x)

    if x < 10:
        return 1

    return 1 + lenDigits(x / 10)

最小限の再帰FTW




整数で格納できる最大の数を求めていると仮定すると、その値は実装に依存します。 私はあなたがPythonを使用するときにそのように考えることはお勧めしません。 いずれにしても、かなり大きな値をPythonの「整数」に格納することができます。 覚えておいて、Pythonはダックタイピングを使用しています。

編集:質問者が数字の桁数を求めていることを明確にする前に私は答えを出しました。 そのために、私は受け入れられた答えによって提案された方法に同意します。 何も追加する必要はありません!




すべてのmath.log10ソリューションで問題が発生します。

math.log10は高速ですが、数値が999999999999997より大きい場合に問題が発生します。これは浮動小数点数が.9sが多すぎるために結果が丸められるためです。

解決策は、そのしきい値を上回る数に対してはwhileカウンタ方式を使用することです。

これをさらに高速にするには、10 ^ 16、10 ^ 17などを作成し、変数としてリストに格納します。 そうすれば、それはテーブル参照のようなものです。

def getIntegerPlaces(theNumber):
    if theNumber <= 999999999999997:
        return int(math.log10(theNumber)) + 1
    else:
        counter = 15
        while theNumber >= 10**counter:
            counter += 1
        return counter



親愛なるユーザー@Calvintwrのように、関数math.log10は、[-999999999999997,999999999999997]の範囲外の数値に問題があり、ここで浮動小数点エラーが発生します。 私はJavaScript(Google V8とNodeJS)とC(GNU GCCコンパイラ)でこの問題を抱えていたので、ここでは'purely mathematically'解決することは不可能です。

このgistとanswer基づいて親愛なるユーザー@Calvintwr

import math


def get_count_digits(number: int):
    """Return number of digits in a number."""

    if number == 0:
        return 1

    number = abs(number)

    if number <= 999999999999997:
        return math.floor(math.log10(number)) + 1

    count = 0
    while number:
        count += 1
        number //= 10
    return count

私は長さが最大20(両端を含む)の数字とそれをすべてテストしました。 64ビットシステムの長さの最大整数は19( len(str(sys.maxsize)) == 19 )なので、十分でなければなりません。

assert get_count_digits(-99999999999999999999) == 20
assert get_count_digits(-10000000000000000000) == 20
assert get_count_digits(-9999999999999999999) == 19
assert get_count_digits(-1000000000000000000) == 19
assert get_count_digits(-999999999999999999) == 18
assert get_count_digits(-100000000000000000) == 18
assert get_count_digits(-99999999999999999) == 17
assert get_count_digits(-10000000000000000) == 17
assert get_count_digits(-9999999999999999) == 16
assert get_count_digits(-1000000000000000) == 16
assert get_count_digits(-999999999999999) == 15
assert get_count_digits(-100000000000000) == 15
assert get_count_digits(-99999999999999) == 14
assert get_count_digits(-10000000000000) == 14
assert get_count_digits(-9999999999999) == 13
assert get_count_digits(-1000000000000) == 13
assert get_count_digits(-999999999999) == 12
assert get_count_digits(-100000000000) == 12
assert get_count_digits(-99999999999) == 11
assert get_count_digits(-10000000000) == 11
assert get_count_digits(-9999999999) == 10
assert get_count_digits(-1000000000) == 10
assert get_count_digits(-999999999) == 9
assert get_count_digits(-100000000) == 9
assert get_count_digits(-99999999) == 8
assert get_count_digits(-10000000) == 8
assert get_count_digits(-9999999) == 7
assert get_count_digits(-1000000) == 7
assert get_count_digits(-999999) == 6
assert get_count_digits(-100000) == 6
assert get_count_digits(-99999) == 5
assert get_count_digits(-10000) == 5
assert get_count_digits(-9999) == 4
assert get_count_digits(-1000) == 4
assert get_count_digits(-999) == 3
assert get_count_digits(-100) == 3
assert get_count_digits(-99) == 2
assert get_count_digits(-10) == 2
assert get_count_digits(-9) == 1
assert get_count_digits(-1) == 1
assert get_count_digits(0) == 1
assert get_count_digits(1) == 1
assert get_count_digits(9) == 1
assert get_count_digits(10) == 2
assert get_count_digits(99) == 2
assert get_count_digits(100) == 3
assert get_count_digits(999) == 3
assert get_count_digits(1000) == 4
assert get_count_digits(9999) == 4
assert get_count_digits(10000) == 5
assert get_count_digits(99999) == 5
assert get_count_digits(100000) == 6
assert get_count_digits(999999) == 6
assert get_count_digits(1000000) == 7
assert get_count_digits(9999999) == 7
assert get_count_digits(10000000) == 8
assert get_count_digits(99999999) == 8
assert get_count_digits(100000000) == 9
assert get_count_digits(999999999) == 9
assert get_count_digits(1000000000) == 10
assert get_count_digits(9999999999) == 10
assert get_count_digits(10000000000) == 11
assert get_count_digits(99999999999) == 11
assert get_count_digits(100000000000) == 12
assert get_count_digits(999999999999) == 12
assert get_count_digits(1000000000000) == 13
assert get_count_digits(9999999999999) == 13
assert get_count_digits(10000000000000) == 14
assert get_count_digits(99999999999999) == 14
assert get_count_digits(100000000000000) == 15
assert get_count_digits(999999999999999) == 15
assert get_count_digits(1000000000000000) == 16
assert get_count_digits(9999999999999999) == 16
assert get_count_digits(10000000000000000) == 17
assert get_count_digits(99999999999999999) == 17
assert get_count_digits(100000000000000000) == 18
assert get_count_digits(999999999999999999) == 18
assert get_count_digits(1000000000000000000) == 19
assert get_count_digits(9999999999999999999) == 19
assert get_count_digits(10000000000000000000) == 20
assert get_count_digits(99999999999999999999) == 20

Python 3.5でテストされたコードのすべての例




Related