上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
2.8 浮点数与格式化打印
理解了精度的概念,才能明白为什么浮点数通过fmt.Println能够打印出精确的十进制值。这是因为fmt.Println内部对于浮点数进行了复杂的运算,将其转换为了最接近的十进制值。由于精度是无损的,所以能够精准表示十进制值。
理解了精度的概念,就能够明白为什么Go语言中默认浮点数打印出的值为8位了。因为8位以上就一定不准确了。如下所示,小数位后有9位,其打印出的结果为0.33333334,精度已经丢失。
fmt可以格式化打印浮点数的多种格式,其用例如下所示。
格式化输出浮点数的核心是调用标准库strconv.FormatFloat函数。抛开格式化的操作,该函数的核心功能是计算出浮点数最接近的十进制值。Go语言借助Grisu3算法快速并精准打印浮点数,该算法的速度是普通高精度算法的4倍[2]。但Grisu3会有很小的失败概率,当失败时,会使用更慢但是更精准的方式计算出浮点数最接近的十进制值,从而进一步对数据进行格式化表达。