【发布时间】:2020-01-08 21:00:36
【问题描述】:
这似乎是一个非常愚蠢的问题,但老实说,我无法找到令人满意的解决方案。到目前为止,我发现的所有“显而易见”的解决方案都有一些隐藏的问题。
我想将浮点值格式化为任意宽度或相对精度,同时保持{:g}格式说明符的自适应格式。 (使用科学记数法或正规记数法,取决于数字的大小)
给定:
import math # Here is how the default (str) formatting displays these values
# Small values
long_small = 10**-16/3 # 3.3333333333333335e-17
short_small = 10**-16 # 1e-16
# Medium values
long_medium = math.pi # 3.141592653589793
short_medium = 130.0 # 130.0
# Large values
long_large = 10.0**16 + 2 # 1.0000000000000002e+16
short_large = 10.0**16 # 1e+16
在任意 width 的情况下,我想将这些数字格式化如下(例如,width=8):
long_small # 3.33e-17
short_small # 1.00e-16
long_medium # 3.141593
short_medium # 130.0000
long_large # 1.00e+16
short_large # 1.00e+16
在任意相对精度的情况下,我想将这些数字格式化如下 (precision=8):
long_small # 3.33333333e-17
short_small # 1.00000000e-16
long_medium # 3.14159265
short_medium # 130.000000
long_large # 1.00000000e+16
short_large # 1.00000000e+16
-
{:N.Mf}不够好,因为我想为非常大和非常小的数字保留科学记数法格式 -
{:N.Mg}和{:N.M}还不够好,因为它们会丢弃尾随零,以及用空格填充的“宽度”说明符,而不是添加数字 -
{:N.Me}始终使用科学计数法 - 任何使用
>0或<0的“聪明的技巧”都不起作用,因为它要么添加前导零,要么在尾数后添加零 - 任何“聪明的黑客”,尝试使用
{:f}或{:e}格式化并尝试使用.replace(...)或[:fixed_width]生成的字符串都不起作用,因为各种边缘情况,它会改变数字,截去尾数或浮点数(.)
【问题讨论】:
标签: python floating-point formatting