目前是这么写的,格式化了两遍,有更好的写法吗?
>>> 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'
1
bankroft 2021-10-29 10:01:40 +08:00
round(x, 2)
|
3
iBaoger 2021-10-29 10:28:21 +08:00 via Android
浮点型可能满足不了这个操作,转换为字符串处理
|
4
ulosggs 2021-10-29 10:28:54 +08:00
粗暴点 ('%.2f' % value).rstrip('0')
|
6
zjj19950716 2021-10-29 10:35:09 +08:00
@ulosggs $ python3 -c "print(('%.2f' % 3).rstrip('0'))"
3. |
7
zpfhbyx 2021-10-29 10:38:13 +08:00
我寻思 直接 %.2f 就行了啊
|
8
zpfhbyx 2021-10-29 10:38:36 +08:00
啊哦 末位删除..忽略
|
9
wangchonglie 2021-10-29 11:13:31 +08:00
请问正文里的 :g 有什么作用呢?
|
12
Ediacaran 2021-10-29 11:42:50 +08:00 via iPhone
‘{:g}’.format(round(f, 2))
|
13
ericls 2021-10-29 11:49:53 +08:00
'.'.join(str(int(i)) for i in divmod(num * 100, 100) if i)
|
14
ericls 2021-10-29 11:52:33 +08:00
呃 不对
|
15
ipwx 2021-10-29 12:11:50 +08:00
就不能多写一个函数吗。。。
def format_num(v): ....s = f'{v:.2f}' ....if '.' in s: ........s = s.rstrip('0') ....return s |
16
ipwx 2021-10-29 12:12:43 +08:00
In [3]: def format_num(v):
...: s = f'{v:.2f}' ...: if '.' in s: ...: s = s.rstrip('0').rstrip('.') ...: return s ...: In [4]: format_num(100) Out[4]: '100' In [5]: format_num(100.1) Out[5]: '100.1' In [6]: format_num(100.15) Out[6]: '100.15' In [7]: format_num(100.159) Out[7]: '100.16' |
17
ipwx 2021-10-29 12:13:00 +08:00
记得 rstrip('0') 以后再 rstrip('.')
|
18
dicc 2021-10-29 12:14:27 +08:00
就 rstrip('.0')
|
20
coolair OP @wangchonglie 删除后面的 0
|
21
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 >>> ``` |
22
CEBBCAT 2021-10-29 13:10:20 +08:00
import math; print("{:g}".format(math.pi-math.pi%0.01))
|
23
CEBBCAT 2021-10-29 13:12:18 +08:00
|
24
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' |
26
CEBBCAT 2021-10-29 13:23:37 +08:00 via Android
@ipwx 咳咳,饶我狗命,我只是想起来了记忆深处的 CPP 代码,像替换 round 这种操作,可以放在问题解决后再优化
|
27
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)) |
28
cloudfox 2021-10-29 15:37:17 +08:00
正则的话"\.?0+$"就好了
|
29
JeffGe 2021-10-29 15:59:28 +08:00 via Android
你这个需求有点奇怪,工程上 3.1 和 3.10 不等价,3.10 有效数字更多,去掉后都改变原数的精度了。所以我猜原生优雅的写法是没有的,我觉得上面单独写个函数先 round 两位再处理字符串的写法就可以了,正则或者自己写逻辑处理都行,考虑科学计数法那就 split('e'),处理 [0],再 'e'.join 回去。
|
31
bomb77 2021-10-29 17:46:04 +08:00
str(round(3.00000, 2)).rstrip('.0')
|
33
c0xt30a 2021-10-30 05:57:33 +08:00
打个表吧,后两位才 100 中情形,枚举出来就完了
|