![Go语言底层原理剖析](https://wfqqreader-1252317822.image.myqcloud.com/cover/131/40795131/b_40795131.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
2.8 浮点数与格式化打印
理解了精度的概念,才能明白为什么浮点数通过fmt.Println能够打印出精确的十进制值。这是因为fmt.Println内部对于浮点数进行了复杂的运算,将其转换为了最接近的十进制值。由于精度是无损的,所以能够精准表示十进制值。
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_53_2.jpg?sign=1739254875-qU2zEu2EU8xXiTSWDGnw5oDUQU366wU0-0-8a670b1ec6724ed3ca3163f97b6936fa)
理解了精度的概念,就能够明白为什么Go语言中默认浮点数打印出的值为8位了。因为8位以上就一定不准确了。如下所示,小数位后有9位,其打印出的结果为0.33333334,精度已经丢失。
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_54_1.jpg?sign=1739254875-P4TzGZVYyOcCdjBOrRJdwfvigGAivdQt-0-7d6a4a291913b4395010df62b99b34f0)
fmt可以格式化打印浮点数的多种格式,其用例如下所示。
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_54_2.jpg?sign=1739254875-m7R094FIjHd9qip7KZ0OugegpUN7tWMR-0-c9179f6d2e1ca155b95e0a148b98fedf)
格式化输出浮点数的核心是调用标准库strconv.FormatFloat函数。抛开格式化的操作,该函数的核心功能是计算出浮点数最接近的十进制值。Go语言借助Grisu3算法快速并精准打印浮点数,该算法的速度是普通高精度算法的4倍[2]。但Grisu3会有很小的失败概率,当失败时,会使用更慢但是更精准的方式计算出浮点数最接近的十进制值,从而进一步对数据进行格式化表达。
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_54_3.jpg?sign=1739254875-Fmn12qN5DwT6qk8omnpqjbb1Qrfbl0Mu-0-c34d8180be17ee95e92510a8c805f521)