在Python中将浮点数转换为字符串并去掉小数点后的零
我在把一个浮点数转换成字符串时遇到了困难:
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('.')