Python 格式化数字,最多保留两位小数点,小数点末尾为 0 则删除,怎么写好?

2021-10-29 09:59:37 +08:00
 coolair

目前是这么写的,格式化了两遍,有更好的写法吗?

>>> f"{float(f'{3.100:.2f}'):g}"
'3.1'
>>> f"{float(f'{3.104:.2f}'):g}"
'3.1'
>>> f"{float(f'{3.134:.2f}'):g}"
'3.13'
1977 次点击
所在节点    问与答
34 条回复
TrembleBeforeMe
2021-10-29 13:04:22 +08:00
```
>>> float(str(float(3.104))[:4])
3.1
>>> float(str(float(3.134))[:4])
3.13
>>> float(str(float(3.100))[:4])
3.1
>>>
```
CEBBCAT
2021-10-29 13:10:20 +08:00
import math; print("{:g}".format(math.pi-math.pi%0.01))
CEBBCAT
2021-10-29 13:12:18 +08:00
ipwx
2021-10-29 13:15:16 +08:00
@CEBBCAT 这个不行,因为 %g 会用科学记数法。

In [4]: v = 1234567890.1234

In [5]: f'{v - v % 0.01:g}'
Out[5]: '1.23457e+09'
ipwx
2021-10-29 13:16:29 +08:00
@CEBBCAT 而且 v- v%0.01 这种写法也太恶臭了,明明可以 round(v, 2)
CEBBCAT
2021-10-29 13:23:37 +08:00
@ipwx 咳咳,饶我狗命,我只是想起来了记忆深处的 CPP 代码,像替换 round 这种操作,可以放在问题解决后再优化
princelai
2021-10-29 14:49:06 +08:00
换成字符串上正则

pat = re.compile("\d+.*?(?=(\.0+$)|(0*$))")

num = [3.000,3.1000,3.061000,3.14159]
for n in num:
____print(pat.search(f"{round(n,2)}").group(0))
cloudfox
2021-10-29 15:37:17 +08:00
正则的话"\.?0+$"就好了
JeffGe
2021-10-29 15:59:28 +08:00
你这个需求有点奇怪,工程上 3.1 和 3.10 不等价,3.10 有效数字更多,去掉后都改变原数的精度了。所以我猜原生优雅的写法是没有的,我觉得上面单独写个函数先 round 两位再处理字符串的写法就可以了,正则或者自己写逻辑处理都行,考虑科学计数法那就 split('e'),处理 [0],再 'e'.join 回去。
dicc
2021-10-29 17:44:48 +08:00
@GTim 666666
bomb77
2021-10-29 17:46:04 +08:00
str(round(3.00000, 2)).rstrip('.0')
sugar2845
2021-10-30 01:11:31 +08:00
@dicc 用 removesuffix ?
c0xt30a
2021-10-30 05:57:33 +08:00
打个表吧,后两位才 100 中情形,枚举出来就完了
dicc
2021-10-30 10:14:49 +08:00
@sugar2845
@bomb77 17 楼正解

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/811433

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX