浮点数介绍
float32float64
mathmath.MaxFloat32float32math.MaxFloat64float64
单精度 浮点类型取值范围
float32负数时-3.402823E38 到 -1.401298E-45
float32正数时1.401298E-45 到 3.402823E38
双精度 浮点类型取值范围
float64-1.79E+308 到 +1.79E+308
1.79E-3081.79E+308
mathNaN
var z float64
fmt.Println(z, -z, 1/z, -1/z, z/z) // "0 -0 +Inf -Inf NaN"
math.IsNaNNaNmath.NaNmath.NaN
bit
nan := math.NaN()
fmt.Println(nan == nan, nan < nan, nan > nan)  // "false false false"

如果一个函数返回的浮点数结果可能失败,最好的做法是用单独的标志报告失败,像这样:

func compute() (value float64, ok bool) {
	// ...
	if failed {
		return 0, false
	}
	return result, true
}
float32float64float64float32float32
单精度双精度两者区别

在内存中占有的字节数不同

  • 单精度浮点数在机内占4个字节。
  • 双精度浮点数在机内占8个字节。

有效数字位数不同

  • 单精度浮点数 有效数字7位。
  • 双精度浮点数 有效数字16位。

使用情况区别

  • 一般用来表示美元和分的时候用单精度类型。
  • 超出人类经验的数字函数,例如 sin() cos() tan() sqrt() 都使用双精度值。
浮点数类型值的字面量形式

一个浮点数的完整字面量形式包含一个十进制整数部分、一个小数点、一个十进制小数部分和一个整数指数部分。常常地,某些部分可以根据情况省略掉。

1.23
01.23 // == 1.23
.23
1.
// 一个e或者E随后的数值是指数值(底数为10)。
// 指数值必须为一个可以带符号的十进制整数字面量。
1.23e2  // == 123.0
123E2   // == 12300.0
123.E+2 // == 12300.0
1e-1    // == 0.1
.1e0    // == 0.1
0010e-2 // == 0.1
0e+5    // == 0.0

从Go 1.13开始,Go也支持另一种浮点数字面量形式(权称为十六进制浮点数文字表示)。 在一个十六进制浮点数文字表示中,

0x0XpPeEyPny2^nyP-ny2^n
0x1p-2     // == 0.25
0x2.p10    // == 2048.0
0x1.Fp+0   // == 1.9375
0X.8p-0    // == 0.5
0X1FFFP-16 // == 0.1249847412109375

而下面这几个均是不合法的浮点数的十六进制文字表示。

0x.p1    // 整数部分表示必须包含至少一个数字
1p-2     // p指数形式只能出现在浮点数的十六进制文字表示中
0x1.5e-2 // e和E不能出现在浮点数的十六进制文字表示中
0.00..00e00x0p0