科学计数法精度归一化

问题描述 投票:0回答:3

我的目标只是将“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 的东西。

python format notation exponential
3个回答
40
投票

您可以按以下格式指定精度:

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

这将始终提供 2 位小数的精度。您想要的精度必须由您自己决定。如果您在评论中需要该帖子的任何帮助。


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

这并不是最优雅的解决方案,但这个任务一开始就有点令人讨厌,但它完成了工作。


1
投票

我对 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]))
© www.soinside.com 2019 - 2024. All rights reserved.