用于存放带小数的数值,分为 float32 和 float64 两种类型。都是有符号的,支持正数、负数和零。
一、浮点型的分类
- float32 占用 4 个字节,精度约为 6 位十进制数字;-3.4e38 到 3.4e38 的范围。
- float64 占用 8 个字节,精度约为 15 位十进制数字。-1.7e308 到 1.7e308 的范围。
二、浮点型的默认值、类型
- 浮点型的默认类型是 float64
- 浮点型的零值为 0.0
三、浮点数的存储分为三部分:符号位、指数位和尾数位。
- float32 的符号位占 1 位,指数位占 8 位,尾数位占 23 位;
- float64 的符号位占 1 位,指数位占 11 位,尾数位占 52 位。
四、查看浮点型
- 浮点型可使用 fmt.Printf() 函数配合 %f 格式化动词来获取变量的值
- 使用 fmt.Printf() 函数配合 %T 格式化动词来获取变量的类型
- 使用 fmt.Printf() 函数配合 %d 格式化动词来获取变量占用的字节数。
五、浮点型的使用细节:
- 浮点数有固定的范围和字段长度,不受操作系统的影响,但在不同平台上可能会有细微的差异,建议在需要高精度计算的场景下使用 float64。
- 浮点数类型分为 float32 和 float64,float64 的精度更高,适合需要高精度计算的场景;float32 占用内存更少,适合对内存要求较高的场景
- 浮点型变量的默认类型为 float64,零值为 0.0
- 浮点数常量有两种表示形式:十进制和科学计数法。例如:3.14、1e-9、2.5e6 等
- 浮点型变量可以进行算术运算和比较运算,但不支持位运算
- 浮点型之间可以进行类型转换,但需要显式转换,例如:var f float64 = 3.14; var i int = int(f)。
- 浮点型的特殊值:正无穷大(math.Inf(1))、负无穷大(math.Inf(-1))和 NaN(math.NaN())。这些特殊值在进行比较运算时需要特别注意,例如:NaN 不等于任何值,包括它自己。
六、案例
package main
import (
"fmt"
"unsafe"
)
func main() {
// 1、浮点型变量
var f32 float32 = 3.14// float32 的变量
var f64 float64 = 3.141592653589793// float64 的变量
fmt.Println("float32 f32 =", f32)
fmt.Println("float64 f64 =", f64)
fmt.Printf("f32 的类型是%T\n", f32)
fmt.Printf("f64 的类型是%T\n", f64)
fmt.Printf("f32 占用的字节数是%d\n", unsafe.Sizeof(f32))
fmt.Printf("f64 占用的字节数是%d\n", unsafe.Sizeof(f64))
// 2、如果float64的值超出float32的范围,进行类型转换时会发生溢出,结果为正无穷大(Inf)
var f64_large float64 = 1e40 // 超出 float32 的范围
var f32_large float32 = float32(f64_large) // 转换为 float32 会发生溢出
fmt.Println("float64 f64_large =", f64_large)
fmt.Println("float32 f32_large =", f32_large)
// 3、浮点型的特殊值
var f_inf float64 = 1.0 / 0.0 // 正无穷大
var f_ninf float64 = -1.0 / 0.0 // 负无穷大
var f_nan float64 = 0.0 / 0.0 // NaN
fmt.Println("正无穷大 f_inf =", f_inf)
fmt.Println("负无穷大 f_ninf =", f_ninf)
fmt.Println("NaN f_nan =", f_nan)
fmt.Println("f_inf > 0:", f_inf > 0) // true
fmt.Println("f_ninf < 0:", f_ninf < 0) // true
fmt.Println("f_nan == f_nan:", f_nan == f_nan) // false
// 4、精度丢失
var f64_precise float64 = 0.12345678901234567 // 超过 float32 的精度范围
var f32_precise float32 = float32(f64_precise) // 转换为 float32 会发生精度丢失
fmt.Println("float64 f64_precise =", f64_precise)
fmt.Println("float32 f32_precise =", f32_precise)
// 5、浮点数变量的默认类型为 float64,零值为 0.0
var f_default float64 // 默认类型为 float64,零值为 0.0
fmt.Println("默认浮点数 f_default =", f_default)
// 6、浮点型之间可以进行类型转换,但需要显式转换
var f float64 = 3.14
var i int = int(f) // 显式转换为 int,结果为 3,丢失小数部分
fmt.Println("float64 f =", f)
fmt.Println("int i =", i)
// 7、浮点型变量可以进行算术运算和比较运算,但不支持位运算
var f1 float64 = 1.5
var f2 float64 = 2.5
fmt.Println("f1 + f2 =", f1 + f2) // 4.0
fmt.Println("f1 * f2 =", f1 * f2) // 3.75
fmt.Println("f1 > f2:", f1 > f2) // false
// 8、浮点数常量有两种表示形式:十进制和科学计数法。例如:3.14、1e-9、2.5e6 等。
var f_const1 float64 = 3.14 // 十进制表示
var f_const2 float64 = 1e-9 // 科学计数法
fmt.Println("浮点数常量 f_const1 =", f_const1)
fmt.Println("浮点数常量 f_const2 =", f_const2)
}