物理の駅 Physics station by 現役研究者

テクノロジーは共有されてこそ栄える

Python で数値を科学的表記にする方法

科学的な表記のため、あまりにも長い桁数を丸める必要がある。ざっくりそういう需要のための関数を作った。

やり方は、指数表記にして指数部の大きさで判定させているだけである。自分で作ったほうが早いと思うので参考にしつつ作ってみてはどうだろうか。

def align_digit(f, digit=None,shift=3):
    if digit==None:
        digit = int("{:e}".format(f).split("e")[1])-shift
    if digit<=0: s = str("{:."+str(-digit)+"f}").format(f)
    else: s = str("{:.3e}").format(f)
    return s, digit

print(align_digit(0.00001))
print(align_digit(0.0000100123))

print(align_digit(0.0001))
print(align_digit(0.000100123))

print(align_digit(0.001))
print(align_digit(0.00100123))

print(align_digit(0.01))
print(align_digit(0.0100123))

print(align_digit(0.1))
print(align_digit(0.100123))

print(align_digit(1))
print(align_digit(1.00123))

print(align_digit(10))
print(align_digit(10.0123))

print(align_digit(100))
print(align_digit(100.123))

print(align_digit(1000))
print(align_digit(1001.23))

print(align_digit(10000))
print(align_digit(10012.3))

print(align_digit(100000))
print(align_digit(100123))

shift=3 桁分余分に表示するという感じ。結果は以下の通り

('0.00001000', -8)
('0.00001001', -8)
('0.0001000', -7)
('0.0001001', -7)
('0.001000', -6)
('0.001001', -6)
('0.01000', -5)
('0.01001', -5)
('0.1000', -4)
('0.1001', -4)
('1.000', -3)
('1.001', -3)
('10.00', -2)
('10.01', -2)
('100.0', -1)
('100.1', -1)
('1000', 0)
('1001', 0)
('1.000e+04', 1)
('1.001e+04', 1)
('1.000e+05', 2)
('1.001e+05', 2)

戻り値のtupleの2つめを再利用してdigit=に入れると、同じ桁数の表記が得られる。