我正在尝试使用来获得一些具有相同宽度格式的浮点数fmt.Printf()。
fmt.Printf()
例如,给定float值0.0606060606060606、0.3333333333333333、0.05、0.4和0.1818181818181818,我希望将每个值格式化为10个符文:
0.06060606 0.33333333 0.05 0.4 0.18181818
但我不知道它是如何完成的。文档说
对于浮点值,width设置字段的最小宽度,而precision设置小数点后的位数(如果适用),但%g /%G除外,它设置位数的总数。例如,给定123.45,格式%6.2f打印123.45,而%.4g打印123.5。%e和%f的默认精度为6;对于%g,它是唯一标识该值所需的最少位数。
因此,如果我使用%f较大的数字将不适合10个字符的约束,因此%g是必需的。最小宽度为10是%10g,最大宽度为9位(点为+1)%.9g,但是将它们组合起来%10.9g并不像我期望的那样
%f
%g
%10g
%.9g
%10.9g
0.0606060606 0.333333333 0.05 0.4 0.181818182
我怎么得到10个符文的字符串,其他11个符文的字符串和其他12个符文的字符串?
特别是似乎%.9g总共不产生9位数字。参见例如:http : //play.golang.org/p/ie9k8bYC7r
首先,我们需要正确理解文档:
width设置字段的最小宽度,而precision设置小数点后的位数(如果适用),除了%g /%G以外,它设置位数的总数。
这条线路是语法正确的,但 它 在这句话中的最后一部分是真的困惑:它实际上指 的精度 ,而不是 宽度 。
因此,让我们看一些示例:
123.45 12312.2 1.6069 0.6069 0.0006069
然后像打印一样fmt.Printf("%.4g"),它可以给您
fmt.Printf("%.4g")
123.5 1.231e+04 1.607 0.6069 0.0006069
仅4 位数字,不包括所有小数点和指数 。但是,等等,最后两个示例会怎样?您是在跟我开玩笑吗,位数不超过5位吗?
这是打印过程中令人困惑的部分: 前导0 不会被算作数字,并且 当少于4个零时也不会缩水 。
让我们使用以下示例查看0行为:
package main import "fmt" func main() { fmt.Printf("%.4g\n", 0.12345) fmt.Printf("%.4g\n", 0.012345) fmt.Printf("%.4g\n", 0.0012345) fmt.Printf("%.4g\n", 0.00012345) fmt.Printf("%.4g\n", 0.000012345) fmt.Printf("%.4g\n", 0.0000012345) fmt.Printf("%.4g\n", 0.00000012345) fmt.Printf("%g\n", 0.12345) fmt.Printf("%g\n", 0.012345) fmt.Printf("%g\n", 0.0012345) fmt.Printf("%g\n", 0.00012345) fmt.Printf("%g\n", 0.000012345) fmt.Printf("%g\n", 0.0000012345) fmt.Printf("%g\n", 0.00000012345) }
和输出:
0.1235 0.01235 0.001234 0.0001234 1.234e-05 1.234e-06 1.235e-07 0.12345 0.012345 0.0012345 0.00012345 1.2345e-05 1.2345e-06 1.2345e-07
因此,您可以看到,当少于4个前导0时,它们将被计数,而如果超过4个,则会缩水。
好的,接下来是width。在文档中,width仅指定最小宽度, 包括小数位和指数 。这意味着,如果您的位数多于width指定的位数,它将超出宽度。
width
请记住,宽度将被视为最后一步,这意味着它 首先 需要 满足precision字段 。
让我们回到您的情况。您指定%10.9g,表示您希望总位数为9(不包括前导号)0,并且最小宽度应10包括小数位和指数,并且精度应该优先。
0
10
0.0606060606060606:取9位数字且不带0会给你0.0606060606,因为它已经是12宽度了,所以它通过了最小宽度10;
0.0606060606060606
0.0606060606
0.3333333333333333:取9位数字且不带前导0会给您0.333333333,因为它已经是11宽度,所以它通过了最小宽度10;
0.3333333333333333
0.333333333
0.05:取9位数字且不带前导0会给您0.05,因为它小于宽度10,它将再填充6个宽度以获得10的宽度;
0.05
0.4:同上;
0.4
0.1818181818181818:取9位数字,没有前导0会给你0.181818182与 舍入 ,因为它已经是11宽,它传递的10分钟宽度。
0.1818181818181818
0.181818182
因此,这解释了为什么您得到有趣的打印。