在Python中将浮点数转换为字符串并去掉小数点后的零

9 投票
6 回答
36127 浏览
提问于 2025-04-15 16:04

我在把一个浮点数转换成字符串时遇到了困难:

20.02  --> 20.02
20.016 --> 20.02
20.0   --> 20

看起来%g格式是最适合的,但我得到的结果有点奇怪:

In [30]: "%.2g" % 20.03
Out[30]: '20'

In [31]: "%.2g" % 20.1
Out[31]: '20'

In [32]: "%.2g" % 20.3
Out[32]: '20'

In [33]: "%.2g" % 1.2
Out[33]: '1.2'

In [34]: "%.2g" % 1.0
Out[34]: '1'

In [35]: "%.2g" % 2.0
Out[35]: '2'

In [36]: "%.2g" % 2.2
Out[36]: '2.2'

In [37]: "%.2g" % 2.25
Out[37]: '2.2'

In [38]: "%.2g" % 2.26
Out[38]: '2.3'

In [39]: "%.3g" % 2.26
Out[39]: '2.26'

In [40]: "%.3g" % 2.25
Out[40]: '2.25'

In [41]: "%.3g" % 20.02
Out[41]: '20'

In [42]: "%.3g" % 20.016
Out[42]: '20'

In [43]: "%.20g" % 20.016
Out[43]: '20.015999999999998238'

目前我知道的唯一解决办法是先检查这个数字是不是一个int(整数),然后用%d格式,而不是%f格式,这样太复杂了,我觉得。

有没有人知道为什么会出现这些问题?有没有更简单的方法可以做到这一点?

谢谢。

6 个回答

2

我不太明白你觉得哪里复杂——你得到的结果正是你所要求的,比如说这里所示。例如:

In [32]: "%.2g" % 20.3
Out[32]: '20'

In [33]: "%.2g" % 1.2
Out[33]: '1.2'

在每种情况下,你都要求显示2位数字,这正是发生的情况(在一种情况下,两个数字都在小数点前,在另一种情况下,一个在小数点前,一个在小数点后,这显然是因为数字的大小不同导致的)。

当你要求显示20位数字时,你会看到20位数字——当然大部分数字并没有实际意义(因为双精度IEEE浮点数大约只能提供16位的精度),所以要求显示更少的数字更合理。你当然知道浮点数是以二进制表示的,正如这里所解释的,对吧?如果你需要以十进制表示的浮点数(例如,用于货币计算),可以使用decimal模块(当然,这会慢很多,因为你电脑的硬件提供的是二进制浮点数,十进制版本必须在软件中合成)。

6

可以把四舍五入和 %g 一起使用——你希望最多显示两位数字,所以先四舍五入到两位数字,然后用 %g 来尽量简短地打印出来:

>>> "%g" % round(20.016, 2)
'20.02'
>>> "%g" % round(20, 2)
'20'
14

使用 %f 格式说明符:

('%.2f' % (value,)).rstrip('0').rstrip('.')

使用 round() 函数:

str(round(value)).rstrip('0').rstrip('.')

撰写回答