Python 小数格式化

90 投票
6 回答
256661 浏览
提问于 2025-04-15 20:04

怎样才能把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'

撰写回答