2016-04-04 20 views
3

これらの3つの数字はすべて精度という2桁の数字を共有しています。私は、毎秒キロバイトから毎秒ギガバイトまでのさまざまなデバイスの計算された帯域幅を報告したいとします。私は、共通部(MB /秒と言う)にすべてを変換する小数点をラインアップ、一貫した固定精度の数字を印刷する

1.2 
    0.0034 
56000 

と無関係の数字を出力しないようにするためにのためにすぐに結果を把握するために私の読者のための最も簡単な方法はあります;私の計算値が1.193225、0.00344791、および56188.5622なら、私の読者は上記を見る必要があります - 残りはノイズです。浮動小数点数の広範な書式設定オプションにもかかわらず、Pythonは固定精度で数字を印刷するためのきれいな方法を持っていないようです。これを行う最善の方法は何でしょうか?

この質問にスコアを付けることについての注意:私は、最初の回答に対して最良の(すなわち、単純でわかりやすい、エレガントな)答えを選ぶでしょう。急いでする必要はありません。

+3

「%.1e」形式を使って科学的表記でプリントすることができます。また、[人間が読める数](http://stackoverflow.com/search?q=python+human+readable+numbers)に関するいくつかの関連する質問があるはずです。 –

+0

科学的な表記法は、読者に 'e'部分を理解させることを要求し、1e99が1e13よりもずっと大きいと認識することを認識します。どのような数の桁数が異なるかは明らかではない。 – duanev

+1

リアルタイムで出力するか、すべてのデータを先に取得しますか? –

答えて

2
import math 


def round_s(n): 
    if not n: 
     return n 
    e = int(math.floor(math.log10(abs(n)))) - 1 
    return round(n, -e) 


def fmt(n, size): 
    return '{n:{size}f}'.format(size=size, n=n).rstrip('0').rstrip('.') 


numbers = [ 
    1.193225, 
    1.0, 
    0, 
    -1.0, 
    0.00344791, 
    -0.00344791, 
    56188.5622, 
    -56188.5622, 
] 

for n in numbers: 
    print '{:12.5f} => {}'.format(n, fmt(round_s(n), 14)) 

出力:

 1.19322 =>  1.2 
    1.00000 =>  1 
    0.00000 =>  0 
    -1.00000 =>  -1 
    0.00345 =>  0.0034 
    -0.00345 =>  -0.0034 
56188.56220 => 56000 
-56188.56220 => -56000 

ここに行きます。

1

私は(それぞれが、このタスクの両半分を実行するための最良の方法であると仮定して)2つのスタックオーバーフローの答えを組み合わせることになります。 Round to a specific number of significant figuresalign the numbers using the formatting language

from math import log10, floor 
NUM_DIGITS = 2 # Number of significant digits 

# An example input 
number = 1.193225 

# Round the number 
rounded = round(number, -int(floor(log10(number))) + (NUM_DIGITS - 1)) 

# Print aligned to the decimal point 
print('{part[0]:>3}.{part[1]:<3}'.format(part=str(rounded).split('.'))) 

あなたがで2つの幅を微調整する必要があります文字列フォーマッタは少なくとも数値の最も広い整数と小数部分と同じ幅にする必要があります。完全な説明はそれぞれのリンクされたページで見つけることができます。

0

あなたは、小数点の前になります桁数の最大数を知る必要がある任意の長さの文字列のために仕事をしたい場合:

def my_format(numbers): 
    mxi = max(len(str(num).split(".")[0]) for num in numbers) 
    for num in numbers: 
     if isinstance(num, float): 
      t = "{}".format(float("{:.2g}".format(num))) 
      print(t.rjust((mxi + len(t.split(".")[-1]) + 1), " ")) 
     else: 
      print("{:{mx}}".format(num, mx=mxi) 

任意の長さのために揃える必要があります。

In [10]: numbers = [ 
    1.193225, 
    1.0, 
    0, 
    -1.0, 
    0.00344791, 
    -0.00344791, 
    56188.5622, 
    -56188.5622, 
    123456789, 
    12, 
    123] 

In [11]: my_format(numbers) 
     1.2 
     1.0 
     0 
     -1.0 
     0.0034 
     -0.0034 
    56000.0 
    -56000.0 
123456789 
     12 
     123 
関連する問題