零基础 go - 07(基本数据类型 - 浮点型(小数类型))

3 阅读4分钟

用于存放带小数的数值,分为 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)
}