我无法通过以下方式将float转换为字符串:
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
格式化 - 我认为这太复杂了。
有人知道为什么上面的东西正在变化吗?如何以更简单的方式做到这一点?
感谢。
答案 0 :(得分:12)
使用%f
格式说明符:
('%.2f' % (value,)).rstrip('0').rstrip('.')
使用round()
功能:
str(round(value)).rstrip('0').rstrip('.')
答案 1 :(得分:6)
与%g
一起使用 - 你想要显示最多2位数,所以舍入到两位数,然后使用%g
将其打印得尽可能短:
>>> "%g" % round(20.016, 2)
'20.02'
>>> "%g" % round(20, 2)
'20'
答案 2 :(得分:1)
使用内置函数round
答案 3 :(得分:1)
尝试少于20位的东西。如果您使用20位数字,它将为您提供浮点值的20位数表示,这可能看起来有点奇怪。
答案 4 :(得分:1)
我不确定你在这里找到了什么复杂的东西 - 你得到了确切的指定结果,例如: here。 E.g:
In [32]: "%.2g" % 20.3
Out[32]: '20'
In [33]: "%.2g" % 1.2
Out[33]: '1.2'
在每种情况下,你都要求总共显示2个数字,这就是正在发生的事情(两个数字在一个案例中的尾随点之前,一个在之前,一个在另一个案例之后,但这是一个明显的后果数字各自的大小。
当你要求20位数字时,你会看到20位数字 - 当然大多数都没有意义(双精度IEEE浮点数仅适用于大约16位数的精度),因此更为明智的问题少了。你知道当然浮点数用二进制表示,正如here所解释的那样,对吗?使用decimal(当然,慢得多,因为你的计算机的硬件供应是二进制浮点,十进制版本必须全部用软件合成)你需要的是十进制表示的浮点数(例如,用于货币计算)
答案 5 :(得分:1)
您可以使用.format
代替%
。
>>> '{:.2f}'.format(3.0101)
'3.01'
>>> type('{:.2f}'.format(3.0101))
str
使用%
无法实现更多功能,但可以使用.format
完成。
有关更多格式详情,请查看pyformat