Python动态小数位格式化实现 适配pandas科学计数法转换
动态指定小数位数的科学计数法数值格式化方案
问题背景
- 查阅多方公开资料均未找到适配需求的对应解决方案,核心目标是实现可随场景灵活调整的小数格式化能力,支持通过传入变量动态指定小数保留位数。
- 实际业务场景下,从pandas DataFrame中提取到的数值常为
3.18e-06这类科学计数法格式,这类场景需要将数值转换为指定位数小数的普通格式,例如保留8位小数时输出类似3.18123456的结果。 - 待确认的实现路径:是可以直接将pandas DataFrame对应字段转换为保留指定位数小数的float64类型,还是从数据库读取到
3.18e-06这类数值后,再做小数格式转换更合理。 - 初期的实现思路偏向支持变量传入指定小数精度的格式化方案,最初的思路示例代码如下:
decimal = 0.00000001 "{0:.{decimal}f}".format(a)
验证可用的落地方案
经测试,此前收到的各类建议方案均无法满足实际需求,以下是经过落地验证的实现代码,供有同类需求的开发者参考。
场景说明:ticksize是根据接入的Binance交易对动态变化的变量,取值通常为0.00001、0.0000001这类精度值,方案先根据ticksize计算出对应需要保留的小数位数,再完成数值格式化:
import re async def get_precision(ticksize): a = '{:.{prec}f}'.format(ticksize, prec=15) regex = "..(\d+1).*" try: b = re.match(regex, str(a))[1] precision = len(b) return precision except Exception as e: print(f'An exception has occured on get_precision - {e}') return False # 函数逻辑:返回ticksize小数点后从第一个0开始到末尾有效位的长度,即为需要保留的小数精度 # 拿到精度值后,即可通过字符串格式化输出目标结果 last_buy = '{:.{prec}f}'.format(a, prec=precision) # 示例输出:Last purchase price for XRPBTC: 0.00001588
内容的提问来源于stack exchange,提问作者skurring
相关产品推荐
相关产品推荐

