![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=1738881858-Bq10X9NcDjvo9Pdothz8iuDCjxwHzKwd-0-ae3702bb6ed6fe1ef5b46550c11eac49)
理解了精度的概念,就能够明白为什么Go语言中默认浮点数打印出的值为8位了。因为8位以上就一定不准确了。如下所示,小数位后有9位,其打印出的结果为0.33333334,精度已经丢失。
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_54_1.jpg?sign=1738881858-B4QpwvY47n4lHzZsGi2alkxNM3UQjRKO-0-6859f88c946ab8913fa7c7779344da4b)
fmt可以格式化打印浮点数的多种格式,其用例如下所示。
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_54_2.jpg?sign=1738881858-xisfCJQtdxEh75P9ZhPYifU5Mr8VD2QX-0-86da35ba04b0fcd438fd1e7f5ecd1001)
格式化输出浮点数的核心是调用标准库strconv.FormatFloat函数。抛开格式化的操作,该函数的核心功能是计算出浮点数最接近的十进制值。Go语言借助Grisu3算法快速并精准打印浮点数,该算法的速度是普通高精度算法的4倍[2]。但Grisu3会有很小的失败概率,当失败时,会使用更慢但是更精准的方式计算出浮点数最接近的十进制值,从而进一步对数据进行格式化表达。
![](https://epubservercos.yuewen.com/88BA42/21190707608528606/epubprivate/OEBPS/Images/41662_54_3.jpg?sign=1738881858-ztriyZQ7dA2psCGogrzlj4KHUH6zXxLV-0-b8784b9009a51c66a26ef99603635f93)