20

私の目標は、精度を追加せずに、「1.2」などの文字列を科学的記数法に変換することです。問題は、出力の最後に常に余分な0が表示されることです。

>>> input = "1.2"
>>> print '{:e}'.format(float(input))
1.200000e+00

私はちょうど取得する方法を理解しようとしています1.2e+00。formatステートメントで精度を指定できることはわかっていますが、長い文字列を不必要に切り捨てたくありません。トレーニング0を抑制したいだけです。

Decimal.normalize()を使用してみました。これは、e<2の場合を除いてすべての場合に機能します。

>>> print Decimal("1.2000e+4").normalize()
1.2E+4
>>> print Decimal("1.2000e+1").normalize()
12

ですから、12が欲しくないことを除いて、1.2e+1が欲しいのです。:P

任意の提案をいただければ幸いです!

編集: 明確にするために、入力値は、現在不明な所定の長さにすでに適切に丸められています。適切なフォーマット精度の再計算を避けようとしています。

基本的に、「1.23」と「1234.56」の入力値を持つことができます。これは「1.23e+0」と「1.23456e+3」として出力されるはずです。

入力文字列の長さをチェックし、それを使用して手動で精度を指定する必要があるかもしれませんが、指数形式が任意に0を追加するのを妨げる可能性のあるものを見逃していないことを確認したいと思いました。

4

3 に答える 3

38

次の形式で精度を指定できます。

print '{:.2e}'.format(float(input))

これにより、常に小数点以下2桁の精度が得られます。必要な精度の量は、自分で決定する必要があります。コメントでその投稿についてサポートが必要な場合。

于 2011-04-06T20:47:43.933 に答える
9

戻って古い質問を片付けるだけです。数値の初期精度を直感的に理解するための小さな関数を記述し、それを使用して出力結果をフォーマットすることで、これを解決することになりました。

#used to determine number of precise digits in a string
def get_precision(str_value):
    vals =  str_value.split('.')
    if (vals[0] == '0'):
        return len(vals[1])
    else:
        return len(str_value) -1

# maintain same precision of incoming string on output text
class ExpDecorator(CurrencyDecorator):
    def get_text(self):
        text = self.decoratedCurrency.get_text()
        return ('{:.' + str(get_precision(text)-1) + 'e}').format(float(text))

本当に最も洗練された解決策ではありませんが、タスクはそもそも厄介で、仕事は終わりました。

于 2011-05-23T13:53:29.560 に答える
0

Alexのソリューションを少し調整する必要がありましたが、Pythonの任意の数値から末尾のゼロをすべて削除する関数を作成しました。

def remove_trailing_zeros(value):
value = str(value)
if value.find('e') != -1:
    vals = value.split('e')
    e = vals[1]
    return '{:g}'.format(float(vals[0]))+'e'+e
vals = value.split('.')
if (vals[0] == '0'):
    i = 0
    while vals[1][i] == '0':
        i += 1
    return '{:.{}e}'.format(float(value), len(vals[1][i:]) - 1)
else:
    j = len(vals[0]) - 1
    while vals[0][j] == '0':
        j -= 1
    return '{:.{}e}'.format(float(value), len(vals[0][:j]))
于 2015-12-04T21:18:56.830 に答える