科学计数法精度规范化
我的目标很简单,就是把像“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。
3 个回答
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]))
40
你可以在格式中指定精度:
print '{:.2e}'.format(float(input))
这样做会始终保留两位小数。你想要的精度需要自己决定。如果你需要帮助,可以在评论里提问。
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))
这并不是最优雅的解决办法,但这个任务本身就有点麻烦,最终也达到了目的。