簡體   English   中英

Python Scientific Notation精確標准化

[英]Python Scientific Notation precision normalizing

我的目標是簡單地將諸如“1.2”的字符串轉換為科學記數法而不增加額外的精度。 問題是我總是在輸出結束時得到多余的0。

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

我想弄清楚如何得到1.2e+00 我意識到我可以在我的格式語句中指定精度,但我不想不必要地截斷更長的字符串。 我只是想壓制訓練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的東西。

您可以使用以下格式指定精度:

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

這將始終給出2位小數的精度。 您想要的精確度必須由您自己決定。 如果您在評論中需要該帖子的任何幫助。

回過頭來清理舊問題。 我最后通過編寫一個小函數來解決這個問題,以便直觀地計算數字的初始精度,然后用它來格式化輸出結果。

#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))

這不是最優雅的解決方案,但是任務開始時有點令人討厭,並且完成了工作。

它花了一些調整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]))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM