Python科学符号精度规范化

Python科学符号精度规范化,python,format,notation,exponential,Python,Format,Notation,Exponential,我的目标只是将字符串(如“1.2”)转换为科学符号,而不增加额外的精度。问题是,我总是在输出的末尾有多余的0 >>> input = "1.2" >>> print '{:e}'.format(float(input)) 1.200000e+00 我正在试图弄清楚如何获得1.2e+00。我意识到我可以在format语句中指定精度,但我不想不必要地截断更长的字符串。我只是想压制训练 我尝试过使用Decimal.normalize(),它在所有情况下都有效,但e

我的目标只是将字符串(如“1.2”)转换为科学符号,而不增加额外的精度。问题是,我总是在输出的末尾有多余的0

>>> input = "1.2"
>>> print '{:e}'.format(float(input))
1.200000e+00
我正在试图弄清楚如何获得
1.2e+00
。我意识到我可以在format语句中指定精度,但我不想不必要地截断更长的字符串。我只是想压制训练

我尝试过使用Decimal.normalize(),它在所有情况下都有效,但e<2的情况除外

>>> print Decimal("1.2000e+4").normalize()
1.2E+4
>>> print Decimal("1.2000e+1").normalize()
12
所以这更好,除了我不想要12,我想要1.2e+1P

如有任何建议,将不胜感激

编辑: 为了澄清,输入值已经被适当地四舍五入到现在未知的预定长度。我试图避免重新计算适当的格式精度

基本上,我可以有“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]))

你怎么知道“正确”的位数是多少?请用了解这一点的规则更新问题。请务必涵盖3.33333333案例。@S.Lott:在科学中,我们使用“重要性”。因此,如果我有10米的输入值,我不能给出3.3333米的答案。这是意义的增加,这是非法的。3.3米是正确答案。@nightcracker。但我的3.33333米/秒并没有提高精度。它是1.0m/3.0s。两者的精度都只有1个小数点。这是。首先,你用一根只能精确测量十分之一米的木棍来测量木棍。你测量1.0米。用秒表测量3.0秒。你做了一些物理实验,结果是1.0/3.0。现在,结果必须为0.33 m/s。为什么?因为说你知道0.33和0.333米/秒(0.003米/秒)之间的差异是胡说八道,而你只测量了十分之一秒和米。@nightcracker:我的软件说的是0.33333。问题是如何以某种理想的方式格式化这个数字。你有个规矩。我不知道如何使你的规则与这个问题相匹配。问题是我可能不知道在这个方法中预期的精度是多少。考虑使用这里的方法来识别精度并进行相应的调整:您现在可能知道这一点,但格式化语言允许:
'{:.{}e}.format(float(text),get_precision(text)-1)