Go fmt.Printf(“%f\n”,x)将浮点64舍入到浮点32,但fmt.Println(x)不舍入

Go fmt.Printf(“%f\n”,x)将浮点64舍入到浮点32,但fmt.Println(x)不舍入,go,gofmt,Go,Gofmt,我正在使用字典进行一些测试,为此,我从数据库中以某种格式打印出我想要的Float64值,以便将它们复制并粘贴到我的测试结构数组中,但当我的测试失败时,我注意到这些值不同,但仅相差0.0000000000002 然后,为了检查该值,我在循环中写入了以下内容: fmt.Printf("%f\n",value) fmt.Println(value) 我得到了以下值: 702.200000 702.1999999999998 5683.090000 5683.089999999998 975.3000

我正在使用字典进行一些测试,为此,我从数据库中以某种格式打印出我想要的Float64值,以便将它们复制并粘贴到我的测试结构数组中,但当我的测试失败时,我注意到这些值不同,但仅相差0.0000000000002

然后,为了检查该值,我在循环中写入了以下内容:

fmt.Printf("%f\n",value)
fmt.Println(value)
我得到了以下值:

702.200000
702.1999999999998
5683.090000
5683.089999999998
975.300000
975.3
我检查了文档,没有发现任何迹象表明Float64有特殊符号,或者%f将取代Float32的Float64,但是,当我使用%v或%g时,我没有发现问题,文档指定在适当的时候使用%f

当我使用%.12f指定精度为12时,我也没有遇到问题,但是文档中没有指定默认精度

为什么会发生这种情况

编辑:这与复制品的问题相同,但我相信阿德里安对此的解释更为详细。

:

%e、%f和%g的默认精度为6;对于%g,它是唯一标识值所需的最小位数


啊,克鲁德。我不知道为什么我没有看到。我仔细阅读了文档,以避免出现这种情况。但是,它没有解释为什么我使用%v或%g时精度会发生变化,如问题中所述。其他文档会这样做,特别是%v使用默认格式,对于float32、complex64等,默认格式为%g,关于%g的默认精度,它是唯一识别该值所需的最小位数。非常感谢Adrian!我不知道我怎么会错过这个,我会责怪早上咖啡的缺乏。fmt有非常彻底的文档,但他们肯定需要重写。它包含了内部引用,没有锚链接和细节被埋藏在段落的中间。考虑到这个软件包的使用量,这是很不幸的