如何格式化具有最大小数位数且没有额外零填充的浮点数?
Posted
技术标签:
【中文标题】如何格式化具有最大小数位数且没有额外零填充的浮点数?【英文标题】:How to format a float with a maximum number of decimal places and without extra zero padding? 【发布时间】:2012-05-17 07:06:03 【问题描述】:我需要在 python 中做一些小数位格式。优选地,浮点值应始终显示至少一个起始 0 和一个小数位。示例:
Input: 0
Output: 0.0
小数位数较多的值应继续显示,直到输出 4。所以:
Input: 65.53
Output: 65.53
Input: 40.355435
Output: 40.3554
我知道我可以使用 0.4f 让它打印到小数点后四位,但它会用不需要的 0 填充。是否有格式代码告诉它打印出一定数量的小数,但如果没有数据则将它们留空?我相信 C# 可以通过以下方式实现这一点:
floatValue.ToString("0.0###")
# 符号代表一个可以留空的地方。
【问题讨论】:
【参考方案1】:通过反复试验,我认为 :.15g
是您想要的:
In: f"3/4:.15g"
Out: '0.75'
In f"355/113:.15g"
Out: '3.14159292035398'
(而f"3/4:.15f" == '0.750000000000000'
)
【讨论】:
【参考方案2】:您的要求应通过内置round
函数等舍入方法来解决。然后让float
数字以其string
表示形式自然显示。
>>> round(65.53, 4) # num decimal <= precision, do nothing
'65.53'
>>> round(40.355435, 4) # num decimal > precision, round
'40.3554'
>>> round(0, 4) # note: converts int to float
'0.0'
【讨论】:
..... 是的。是的,就是这样。我一直在寻找格式,因为这就是原始代码完成它的方式,但这就是我想要的。猜猜你可以称之为脑放屁。 这不起作用;round(0.000000001, 4)
给0.0
【参考方案3】:
对不起,我能做到的最好的:
' :0.4f'.format(1./2.).rstrip('0')
更正:
ff=1./2.
' :0.4f'.format(ff).rstrip('0')+'0'[0:(ff%1==0)]
【讨论】:
你已经成功了。他的 C# 示例将1
格式化为 '1.0'
,而您的将其格式化为 '1.'
。
float(':0.4f'.format(x).rstrip('0')) 这也应该解决传递整数的问题。 >>>float(':0.4f'.format(1).rstrip('0')) 1.0
@tapan:返回浮点数,而不是字符串。【参考方案4】:
>>> def pad(float, front = 0, end = 4):
s = '%%%s.%sf' % (front, end) % float
i = len(s)
while i > 0 and s[i - 1] == '0':
i-= 1
if s[i - 1] == '.' and len(s) > i:
i+= 1 # for 0.0
return s[:i] + ' ' * (len(s) - i)
>>> pad(0, 3, 4)
'0.0 '
>>> pad(65.53, 3, 4)
'65.53 '
>>> pad(40.355435, 3, 4)
'40.3554'
【讨论】:
你已经成功了。他的 C# 示例将1.0
格式化为'1.0'
,而您的将其格式化为'1.'
。
有趣的解决方案。它适用于整数,但尝试传入一个值,比如说,2.5 似乎总是返回None
。我会多花点时间。我有点希望格式函数中内置了一些东西来处理这个问题。
哦,对不起 - 我从我的 pyshell 复制了它,它看起来不错,但它破坏了标识。
现在似乎可以工作了。除非有人能提出更适合我的解决方案,否则我会给出答案。以上是关于如何格式化具有最大小数位数且没有额外零填充的浮点数?的主要内容,如果未能解决你的问题,请参考以下文章