问题描述
我想在我的 f 字符串中设置一个精度,但我不想要小数部分的尾随零。
i = 1002
print(f'{i/1000:.2f}') # 1.00 but this must be 1
i = 1009
print(f'{i/1000:.2f}') # 1.01,this is correct
第一个 print
必须是 1
,我的预期行为在第二个 print
中看到,它是 1.01
。
我尝试了 :g
,但它对第一个 print
有效,但对第二个无效。
i = 1000
print(f'{i/1000:.2g}') # 1,this is correct but
i = 1009
print(f'{i/1000:.2g}') # 1,but this must be 1.01
我尝试过的一种方法是 f'{i/1000:.2f}'.strip('.0')
,但我想知道是否有更好的方法。
编辑:
在我的实际代码中,如果 i
是 100000
,那么分母也将是 100000(i
顺序中的最小数字),换句话说,我的代码中的分母将始终是这样 i// 分母将始终产生一个数字。
解决方法
如果您的字符串只有浮点数,那么您可以使用 str.rstrip()
(而不是您现在拥有的 str.strip()
)。此外,您需要首先使用 '0'
对其进行链式调用,然后使用 '.'
像 .rstrip('0').rstrip('.')
来处理带有尾随零的整数,例如 10000
。
但是,如果您的字符串中可以包含其他字符,并且您只想为数字去掉 0
,那么您可以使用嵌套的 f-string 作为:
>>> f"{f'{1002/1000:.2f}'.rstrip('0').rstrip('.')} number"
'1 number'
>>> f"{f'{1009/1000:.2f}'.rstrip('0').rstrip('.')} number"
'1.01 number'
>>> f"{f'{1000:.2f}'.rstrip('0').rstrip('.')} number"
'1000 number'
,
您必须使用两种不同的格式字符串和 round
来检测何时使用它们:
for i in [1002,1009]:
print(f'{i/1000:.0f}') if round(i/1000,2) == 1.00 else print(f'{i/1000:.2f}')
产生的结果:
1
1.01
参考Format Specification Mini-Language
精度是一个十进制数,表示用 'f'
和 'F'
格式化的浮点值的小数点后应显示多少位,或浮点数的小数点前后应显示多少位用 'g'
或 'G'
格式化的值。
是使用我建议的 round
方法还是您提到的 strip
方法取决于您的喜好。如果您以代码应清晰、简洁和可维护的方式理解 Pythonic,那么我会使用 round
方法和两种格式字符串,因为它对未来的开发人员来说非常易读/易懂。