2011-07-03 5 views
2

こんにちは私はいくつかの助けをお願いします。私はxxxxx.yyyyyyyyyyyyyyyのようなフォーマットで浮動小数点数を計算したいと思います。私は、cは0.000000538必死にシンプルなpython小数

として表示させたい

getcontext().prec = 14 
    a = Decimal(str('12.737791301')) 
    b = Decimal(str('12.737791839')) 
    c = Decimal((b - a)) # substract is what I finally want here 

    print a, b, c 

12.737791301 12.737791839 5.38E-7 

:私は、私は多くのことを試みたが、私は多くのことを探索したが、私はまだ次のような単純な問題を抱えている私は、小数点の代わりに、フロート を使用する必要があることを学びましたご協力いただきありがとうございます!

ps。正規化()が機能しませんでした

答えて

5

本当の解決策は、Python 2.6と3.1で利用できるformat()です。

format(c,"f")は、10進数をrepr形式の出力に変換します。これは、Pythonの新しいスタイル書式の一部です。ソリューションの

他より悪いアイデアは以下の通りです:あなたのDecimal値が浮動小数点数であるかのように

これは、フォーマット文字列を用いて達成することができます。 print "%0.9f" % cは '0.000000538'を生成します。

python library referenceより詳しく説明しています。

小数点以下の正しい数を知る必要の問題を回避するために、あなたは常に小数点がある場合には条件にfloat精度の限界で、それをプリントアウト可能性が小さい:

out = "%.16f" % c if c >= 1e-16 else "0.0" 
print out.rstrip('0') 

付き2行目は末尾の0を扱います。

+0

をしたい場合は、 '%の.9f'を使用する際の問題は、あなたがどのように多くの小数点以下件まで知っている必要がありますということですあなたは印刷する必要があり、予期しない結果をもたらすので、 '%.30f'のような書式文字列に任意の長い値を置くことはできません... ' '' print%.9f%(1e-9) ' '... '0.000000001'#これは正しいです ' ' ''%.30f%(1e-9) '' ...' 0.000000001000000000000000062282 '#これはありません' 浮動小数点数の扱いには、常にいくつかの問題があります。 –

+0

これは本当です。指数表記(5.38E-7の例では3)で数字を数え、指数-1にそれを加えるのは、いつも醜いハックです。 frmt = "%0" + str(3 + 7 - 1)+ "f" print frmt%c ...しかし、このようなクルージュ。 – shelhamer

0

quantizeを使用できます。

c_dec = Decimal(c) 
NUMPLACES = Decimal(10)**(c_dec.adjusted() -3) 
c_str = str(c_dec.quantize(NUMPLACES)) 
print c_str 

EDITの行に沿ったもの。あなたの特定の例では、次の作品:

#!/usr/bin/python 
import decimal as dec 

a = dec.Decimal(str('12.737791301')) 
b = dec.Decimal(str('12.737791839')) 
c = dec.Decimal((b - a)) # substract is what I finally want here 

print a 
print b 

sign, digits, exponent=c.as_tuple() 

ld=list(digits) 

PREC=14 
for i in range(0,exponent+PREC+1): 
ld.insert(0,0) 
cstr="0." 
for d in ld: 
    cstr+=str(d) 
print cstr 

あなたはより堅牢な何か、この例を見てhttp://docs.python.org/library/decimal.html#recipes

+0

は単純な例では動作しません(ちょうどテスト済み) – azze

+0

@ azze:正確に何を達成しようとしていますか?出力には小数点以下14桁、有効数字は3桁ありますか? –

+0

私は、値を丸める方法ではなく、正しく印刷された文字列をどのように書式設定するかに関する質問があったと思います。 – Luke

関連する問題