Go 语言浮点型 (小数类型)

发布于: 2020-11-11 17:52:59 作者: 犬小哈 最后修订时间: 2020-11-12 10:06:01

Go 语言中提供了两种精度浮点型 float32float64。这两种浮点型数据格式遵循 IEEE754 浮点数国际标准,该浮点数规范被所有现代的CPU支持。

浮点型 Float32

float32,即我们常说的单精度,存储占用4个字节,也即4*8=32位,其中1位用来符号,8位用来指数,剩下的23位表示尾数:

go语言浮点型float32

浮点型 Float64

float64, 即我们熟悉的双精度,存储占用8个字节,也即8*8=64位,其中1位用来符号,11位用来指数,剩下的52位表示尾数

go语言浮点型float64

浮点数精度

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

图示:

go语言打印浮点数示例代码