科学的な表記のため、あまりにも長い桁数を丸める必要がある。ざっくりそういう需要のための関数を作った。
やり方は、指数表記にして指数部の大きさで判定させているだけである。自分で作ったほうが早いと思うので参考にしつつ作ってみてはどうだろうか。
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=
に入れると、同じ桁数の表記が得られる。