fmt.Printf("%f\n",x) 将 Float64 舍入为 Float32,但 fmt.Println(x) 不会
fmt.Printf("%f\n",x) rounds a Float64 to Float32, but fmt.Println(x) doesn't
我正在使用字典进行一些测试,为此,我以某种格式从数据库中打印出我想要的 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 将 Float64 替换为 Float32,但是,当我使用 %v
或 %g
并且文档指定他们将在适当的时候使用 %f
。
当我使用 %.12f
指定精度为 12 时,我没有遇到问题,但文档中没有指定默认精度。
为什么会这样?
编辑:这与重复的问题相同,但我相信 Adrien 对此的解释更详细。
The default precision for %e, %f and %#g is 6; for %g it is the smallest number of digits necessary to identify the value uniquely.
我正在使用字典进行一些测试,为此,我以某种格式从数据库中打印出我想要的 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 将 Float64 替换为 Float32,但是,当我使用 %v
或 %g
并且文档指定他们将在适当的时候使用 %f
。
当我使用 %.12f
指定精度为 12 时,我没有遇到问题,但文档中没有指定默认精度。
为什么会这样?
编辑:这与重复的问题相同,但我相信 Adrien 对此的解释更详细。
The default precision for %e, %f and %#g is 6; for %g it is the smallest number of digits necessary to identify the value uniquely.