【Python基礎】数値の桁数や小数点以下の桁数を取得したり、指数表示に変換する方法

  • URLをコピーしました!

桁数の取得と指数表示への変換

前回、matplotlibのpcolormeshで数値の範囲が大幅に異なる2種類のプロットを同時に表示する方法を紹介しました。

今回は数値の桁数や小数点以下の桁数を取得したり、指数表示に変換する方法を紹介します。

それでは始めていきましょう。

整数の場合の桁数取得と指数への変換

整数の場合、桁数を取得するにはまず「str(数値)」で文字列に変換し、その文字列の文字の個数を取得します。

その文字の個数が桁数です。

a = 123456789

print(a)
print(len(str(a)))

実行結果
123456789
9

指数表示のする場合、一番大きな桁の数値が1の位に、その後の数値が小数点以下になるので、「桁数-1」で値を割り、「e桁数」とすると指数表示として示すことができます。

a = 123456789

exp = len(str(a))-1

print(a)
print(f"{a/10**exp}e{exp}")

実行結果
123456789
1.23456789e8

また小数点以下で数値を丸めたい場合は「round関数」を使います。

a = 123456789

exp = len(str(a))-1

print(f"{round(a/10**exp, 2)}e{exp}")

実行結果
1.23e8

小数の場合の桁数取得と指数への変換(小数第4位までに数値がある場合)

小数の場合、小数第4位までに1以上の数値がある場合と小数第5位以降に初めて1以上の数値が現れる場合で処理が異なります。

その理由としては小数第5位以降に初めて1以上の数値が現れる場合、例えば「0.0000123456789」の場合は自動で「1.23456789e-5」と書き換えられてしまうからです。

a = 0.000123456789

print(a)

実行結果
0.000123456789
a = 0.0000123456789

print(a)

実行結果
1.23456789e-05

ということでまずは小数第4位までに1以上の数値が現れる場合から説明していきます。

その場合、値を文字列にしたのち、小数点の位置を中心に「split関数」で分割し、小数点より大きい方の桁数が桁数、小数点より小さい方の桁数が小数の桁数となります。

a = 0.123456789

print(a)
print(len(str(a).split(".")[0]))
print(len(str(a).split(".")[1]))

実行結果
0.123456789
1
9

指数表記にする場合、先ほどと同様に「桁数-1」で値を割り、「e桁数」とすると指数表記にはできますが、整数部分の1桁目が0の場合、「0.123456789e0」となってしまいます。

a = 0.123456789

exp = len(str(a).split(".")[0])-1

print(a)
print(f"{a/10**exp}e{exp}")

実行結果
0.123456789
0.123456789e0

実際は「1.23456789e-1」と表記する方が一般的ですので、if文を使って整数部分の1桁目が0の時は「10倍」して、指数を「e-1」として表示するようにします。

a = 0.123456789

exp = len(str(a).split(".")[0])-1

print(a)

if str(a)[0] == "0":
    print(f"{a*10}e-1")
else:
    print(f"{a/10**exp}e{exp}")

実行結果
0.123456789
1.23456789e-1

ちなみに整数部分がもっと大きな数でも

a = 12345.6789

exp = len(str(a).split(".")[0])-1

print(a)

if str(a)[0] == "0":
    print(f"{a*10}e-1")
else:
    print(f"{a/10**exp}e{exp}")

実行結果
12345.6789
1.2345678900000001e4

たまにこの様に最後に「000001」といったほんの少しのずれが出ることがありますので、round関数で丸めておくことをお勧めします。

小数の場合の桁数取得と指数への変換(小数第5位以降に数値がある場合)

小数第5位以降に初めて1以上の数値がある場合、自動で指数表記となってしまいます。

a = 0.000000123456789

print(a)

実行結果
1.23456789e-07

これは表示上の問題で、文字列にした場合は元の指数表記でない表記に戻るかと思ったのですが戻りません。

a = 0.000000123456789

print(str(a))

実行結果
1.23456789e-07

そのため値を「str()」で文字列にしたのち、指数表記の「e」を中心に分割し、eの指数と数値の桁数を取得します。

それを足し合わせて小数の桁数を取得します。

気をつけるべきことは数値の桁数を取得する場合、「1.23456789」のように「.(小数点)」と整数の桁数(ここでは1)が入ってしまいますので、計算した値から「-2」します。

また小数第5位以降で初めて1以上の数値が現れる場合、指数はマイナスになりますので、「abs()」を使って絶対値に変更してから、数値の桁数と足し合わせます。

a = 0.000000123456789

print(a)

if "e" in str(a):
    exp_a = str(a).split("e")[1]
    exp_b = len(str(a).split("e")[0])-2
    print(abs(int(exp_a))+int(exp_b))

実行結果
1.23456789e-07
15

次回はPython上でレンズなどの光学系の光線追跡(レイトレーシング)ができるraytracingライブラリを紹介します。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする