栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

具有%g中的width和precision字段的fmt.Printf表现异常

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

具有%g中的width和precision字段的fmt.Printf表现异常

首先,我们需要正确理解文档:

width设置字段的最小宽度,而precision设置小数点后的位数(如果适用),除了%g /%G以外,它设置位数的总数。

这条线路是语法正确的,但 在这句话中的最后一部分是真的困惑:它实际上指 的精度 ,而不是 宽度

因此,让我们看一些示例:

123.4512312.21.60690.60690.0006069

然后像打印一样

fmt.Printf("%.4g")
,它可以给您

123.51.231e+041.6070.60690.0006069

仅4 位数字,不包括所有小数点和指数 。但是,等等,最后两个示例会怎样?您是在跟我开玩笑吗,位数不超过5位吗?

这是打印过程中令人困惑的部分: 前导0 不会被算作数字,并且 当少于4个零时也不会缩水

让我们使用以下示例查看0行为:

package mainimport "fmt"func main() {    fmt.Printf("%.4gn", 0.12345)    fmt.Printf("%.4gn", 0.012345)    fmt.Printf("%.4gn", 0.0012345)    fmt.Printf("%.4gn", 0.00012345)    fmt.Printf("%.4gn", 0.000012345)    fmt.Printf("%.4gn", 0.0000012345)    fmt.Printf("%.4gn", 0.00000012345)    fmt.Printf("%gn", 0.12345)    fmt.Printf("%gn", 0.012345)    fmt.Printf("%gn", 0.0012345)    fmt.Printf("%gn", 0.00012345)    fmt.Printf("%gn", 0.000012345)    fmt.Printf("%gn", 0.0000012345)    fmt.Printf("%gn", 0.00000012345)}

和输出:

0.12350.012350.0012340.00012341.234e-051.234e-061.235e-070.123450.0123450.00123450.000123451.2345e-051.2345e-061.2345e-07

因此,您可以看到,当少于4个前导0时,它们将被计数,而如果超过4个,则会缩水。

好的,接下来是

width
。在文档中,
width
仅指定最小宽度, 包括小数位和指数
。这意味着,如果您的位数多于
width
指定的位数,它将超出宽度。

请记住,宽度将被视为最后一步,这意味着它 首先 需要 满足precision字段

让我们回到您的情况。您指定

%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分钟宽度。

因此,这解释了为什么您得到有趣的打印。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/484416.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号