Go 是否有任何标准库可以将float64转换为具有固定宽度和最大有效位数的字符串?

Go 是否有任何标准库可以将float64转换为具有固定宽度和最大有效位数的字符串?,go,floating-point,formatting,precision,Go,Floating Point,Formatting,Precision,想象一下,在12个固定宽度的表格中打印时,我们需要打印float64数字: fmt.Printf("%12.6g\n", 9.405090880450127e+119) //"9.40509e+119" fmt.Printf("%12.6g\n", 0.1234567890123) //" 0.123457" fmt.Printf("%12.6g\n", 123456789012.0) //" 1.23457e+11" 我们更喜欢0.1234567890而不

想象一下,在12个固定宽度的表格中打印时,我们需要打印
float64
数字:

fmt.Printf("%12.6g\n", 9.405090880450127e+119) //"9.40509e+119"
fmt.Printf("%12.6g\n", 0.1234567890123)        //"    0.123457"
fmt.Printf("%12.6g\n", 123456789012.0)         //" 1.23457e+11"
我们更喜欢0.1234567890而不是“0.123457”,因为我们会丢失6个有效数字。
我们更喜欢123456789012而不是“1.23457e+11”。我们会丢失6个有效数字

是否有任何标准库可以将
float64
转换为
string
,具有固定宽度和最大有效位数?
提前感谢。

基本上您有两种输出格式:科学记数法或常规格式。这两种格式之间的转折点是
1e12

因此,如果
x>=1e12
,则可以进行分支。在这两个分支中,您可以使用0个分数位数进行格式化,以查看数字的长度,这样您就可以计算12个宽度的分数位数,这样您就可以使用计算出的精度构造最终的格式字符串

科学记数法中也需要预先检查(
%g
),因为指数的宽度可能不同(例如
e+1
e+10
e+100

下面是一个示例实现。这是为了让您开始,但它并不意味着要处理所有情况,而且它不是最有效的解决方案(但相对简单,可以完成任务):

测试它:

fs := []float64{0, 1234.567890123, 0.1234567890123, 123456789012.0, 1234567890123.0,
    9.405090880450127e+9, 9.405090880450127e+19, 9.405090880450127e+119}

for _, f := range fs {
    fmt.Println(format12(f))
}
输出(在上尝试):

fs := []float64{0, 1234.567890123, 0.1234567890123, 123456789012.0, 1234567890123.0,
    9.405090880450127e+9, 9.405090880450127e+19, 9.405090880450127e+119}

for _, f := range fs {
    fmt.Println(format12(f))
}
0.0000000000
0.1234567890
1234.5678901
123456789012
1.234568e+12
9405090880.5
9.405091e+19
9.40509e+119