Python 小数格式化
怎样才能把Python中的小数格式化成下面这样的样子呢?
1.00 --> '1'
1.20 --> '1.2'
1.23 --> '1.23'
1.234 --> '1.23'
1.2345 --> '1.23'
6 个回答
15
这里有一个可以解决问题的函数:
def myformat(x):
return ('%.2f' % x).rstrip('0').rstrip('.')
下面是一些示例:
>>> myformat(1.00)
'1'
>>> myformat(1.20)
'1.2'
>>> myformat(1.23)
'1.23'
>>> myformat(1.234)
'1.23'
>>> myformat(1.2345)
'1.23'
补充:
通过查看其他人的回答和自己尝试,我发现 g 会自动帮你处理所有的去除操作。所以,
'%.3g' % x
这个方法也很好用,而且和其他人推荐的(使用 '{0:.3}'.format() 的方法)稍微有点不同。你可以根据自己的需要选择使用。
32
Justin的回答只有第一部分是对的。使用“%.3g”并不适用于所有情况,因为这里的“.3”并不是指精确到小数点后几位,而是指总共的数字位数。你可以试试像1000.123这样的数字,就会发现它不管用了。
所以,我会采用Justin建议的方法:
>>> ('%.4f' % 12340.123456).rstrip('0').rstrip('.')
'12340.1235'
>>> ('%.4f' % -400).rstrip('0').rstrip('.')
'-400'
>>> ('%.4f' % 0).rstrip('0').rstrip('.')
'0'
>>> ('%.4f' % .1).rstrip('0').rstrip('.')
'0.1'
139
如果你使用的是Python 2.6或更新的版本,可以使用format
方法:
'{0:.3g}'.format(num)
如果你使用的是Python 2.5或更早的版本:
'%.3g'%(num)
解释一下:
{0}
告诉format
要打印第一个参数——在这个例子中就是num
。
冒号(:)后面的内容是format_spec
,用来指定格式。
.3
表示小数点后保留3位数字。
g
会去掉不必要的零。你可以查看这个链接了解更多。
举个例子:
tests=[(1.00, '1'),
(1.2, '1.2'),
(1.23, '1.23'),
(1.234, '1.23'),
(1.2345, '1.23')]
for num, answer in tests:
result = '{0:.3g}'.format(num)
if result != answer:
print('Error: {0} --> {1} != {2}'.format(num, result, answer))
exit()
else:
print('{0} --> {1}'.format(num,result))
结果是
1.0 --> 1
1.2 --> 1.2
1.23 --> 1.23
1.234 --> 1.23
1.2345 --> 1.23
如果你使用的是Python 3.6或更新的版本,可以使用f-strings
:
In [40]: num = 1.234; f'{num:.3g}'
Out[40]: '1.23'