python - 将浮点格式化为固定宽度的python
问题描述
我不关心小数点的位置,并且希望在适当的时候以科学计数法打印以最大精度显示。但是,我想适当地四舍五入以保持固定的宽度,不规则的左边或不规则的右边都可以。
例如
>>> my_format("{:10f}", 0.0000000456)
" 4.56e-08"
>>> my_format("{:10f}", 12.345678987654321)
" 12.345679"
#or "12.34567890" because significant digits
#but not "1.2346e+01", since it is less accurate than the above representations
>>> my_format("{:10f}", 12345678987654321)
"1.2345e+16"
编辑以澄清示例,width
格式说明符不提供固定宽度。它提供了最小宽度。如何获得固定宽度的表示?
解决方案
如果你想要科学记数法,g
格式说明符通常很好,即:
my_format = "{:.10g}".format
应该做正确的事:
>>> list(my_format(v) for v in (0.0000000456, 12.345678987654321, 12345678987654321))
['4.56e-08', '12.34567899', '1.234567899e+16']
后来我意识到上面的功能没有做OP想要的
根据@a_guest 的有用评论,我提出了以下建议:
def my_format(v, length=10):
n = length
while n > 0:
i = len('%#.*g' % (n, v))
s = '%.*g' % (n + n - i, v)
if len(s) <= length:
return s
n -= 1
return s
我现在['4.56e-08', '12.345679', '1.2346e+16']
回来了,它更接近想要的东西。
我已经通过使用以下方法生成大量随机数来对此进行测试:
from random import uniform
def rnd_float():
return uniform(-10, 10) * 10 ** (uniform(-1.6, 1.6) ** 11)
相当随意,但生成的数字相当接近我关心的分布。即大多在 1 左右,但有一些非常小和大,概率还不错。
我已经将数字从这里传递到my_format
100k 次,并且我得到了适当格式的数字。
推荐阅读
- python - 尝试连接数据库和 Web 容器时 SQL Alchemy 连接被拒绝
- c++ - c++ 的反向代理
- go - 在文件保存期间扫描整个文件夹
- java - Android Kotlin 在第二个 Activity 中获取 BackStack 的计数
- nginx - Nginx 返回标头指示缓存状态
- python - 创建一个自我更新的分数
- python - 如何在使用 Pandas 过滤 daframe 时使用“OR”运算符
- office-js - 如何使用 OOXML 在 MS Word 中添加自定义注释?
- draggable - gridstack 3.1.4 和 sortablejs:可拖动排序不起作用 - 可拖动区域覆盖 html 内容(?)
- ios - Xcode AX 查找问题 - 仅发生在真实设备上