Go 语言中提供了两种精度浮点型 float32
和 float64
。这两种浮点型数据格式遵循 IEEE754 浮点数国际标准,该浮点数规范被所有现代的CPU支持。
浮点型 Float32
float32
,即我们常说的单精度,存储占用4个字节,也即4*8=32位,其中1位用来符号,8位用来指数,剩下的23位表示尾数:
浮点型 Float64
float64
, 即我们熟悉的双精度,存储占用8个字节,也即8*8=64位,其中1位用来符号,11位用来指数,剩下的52位表示尾数
浮点数精度
float32
的浮点数最大值约为 3.4e38, 可以通过 match
包的方法来获取: match.MaxFloat32
。
float64
的浮点数最大值约为 1.8e308, 可以通过 match
包的方法来获取: match.MaxFloat64
。
它们分别能表示的最小值近似为1.4e-45和4.9e-324。
一个float32类型的浮点数可以提供大约6个十进制数的精度,而float64则可以提供约15个十进制数的精度;通常应该优先使用float64类型,因为float32类型的累计计算误差很容易扩散,并且float32能精确表示的正整数并不是很大(注意:因为float32的有效bit位只有23个,其它的bit位用于指数和符号;当整数大于23bit能表达的范围时,float32的表示将出现误差):
var f float32 = 16777216 // 1 << 24
fmt.Println(f == f+1) // "true"!
浮点数的字面值可以直接写小数部分,如下所示:
const e = 2.71828
小数点前面或后面的数字都可能被省略(例如.707或1.)。很小或很大的数最好用科学计数法书写,通过e或E来指定指数部分:
const Avogadro = 6.02214129e23 // 阿伏伽德罗常数
const Planck = 6.62606957e-34 // 普朗克常数
打印浮点数
通过 Printf 函数打印浮点数时, 可以使用“%f”来控制保留几位小数, 代码如下:
package main
import (
"fmt"
"math"
)
func main() {
// 打印默认宽度和精度的圆周率, \n 为换行符
fmt.Printf("%f\n", math.Pi)
// 打印默认宽度, 精度(小数点后的位数)为2的圆周率
fmt.Printf("%.2f\n", math.Pi)
}
运行结果如下:
3.141593
3.14