2 回答
TA贡献1770条经验 获得超3个赞
首先,我们需要正确理解文档:
width 设置字段的最小宽度, precision 设置小数点后的位数,如果合适,除了 %g/%G 它设置总位数。
这条线路是语法正确的,但它在这句话中的最后一部分是真的困惑:它实际上指的精度,而不是宽度。
因此,让我们看一些例子:
123.45
12312.2
1.6069
0.6069
0.0006069
然后你把它打印出来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
所以你可以看到,当前导 0 少于 4 个时,它们将被计算在内,如果多于 4 个,它们将被缩小。
好的,接下来是width. 从文档中,width只指定了最小宽度,包括小数位和指数。这意味着,如果您的数字比width指定的多,它将超出宽度。
请记住,宽度将作为最后一步考虑,这意味着它需要首先满足精度字段。
让我们回到你的案例。您指定了%10.9g,这意味着您希望总位数为 9,不包括前导0,最小宽度10包括小数位和指数,并且精度应优先。
0.0606060606060606: 取 9 位不带前导 0 会给你0.0606060606,因为它已经是 12 的宽度,它通过了 10 的最小宽度;
0.3333333333333333: 取 9 位不带前导 0 会给你0.333333333,因为它已经是 11 宽度,它通过了 10 的最小宽度;
0.05: 取 9 位不带前导 0 会给你0.05,因为它小于宽度 10,它将填充另外 6 个宽度以获得 10 的宽度;
0.4: 同上;
0.1818181818181818:取9位数字,没有前导0会给你0.181818182与舍入,因为它已经是11宽,它传递的10分钟宽度。
所以这解释了为什么你得到了有趣的印刷。
- 2 回答
- 0 关注
- 117 浏览
添加回答
举报