ZetCode

Golang float32 类型

最后修改时间 2025 年 5 月 8 日

本教程讲解如何在 Go 中使用 `float32` 内置类型。我们将通过算术运算的实际示例来涵盖浮点数基础知识。

`float32` 类型在 Go 中表示单精度浮点数。它占用 32 位(4 字节)内存,提供约 6-9 位十进制精度。

在 Go 中,`float32` 用于内存效率重要的计算。为了获得更高的精度,通常首选 `float64`。

基本的 float32 声明和初始化

使用 `float32` 最简单的方法是声明和初始化变量。此示例展示了基本的变量声明和算术运算。
注意:在 Go 中,浮点文字默认为 float64。

basic_float32.go
package main

import "fmt"

func main() {

    var f1 float32 = 3.14
    f2 := float32(2.718) // Type conversion
    
    sum := f1 + f2
    product := f1 * f2
    
    fmt.Printf("Sum: %.3f, Product: %.3f\n", sum, product)
    fmt.Printf("Types: f1 %T, f2 %T\n", f1, f2)
}

我们声明了两个 float32 变量并执行了基本算术运算。`%.3f` 格式说明符以 3 位小数打印。文字需要类型转换。

Float32 的精度和限制

与 float64 相比,Float32 的精度有限。此示例演示了对大数和小数的精度限制。

precision.go
package main

import "fmt"

func main() {

    large := float32(123456789.0)
    small := float32(0.000000123456789)
    
    fmt.Println("Large number:", large)
    fmt.Println("Small number:", small)
    
    // Demonstrate precision loss
    a := float32(1.0000001)
    b := float32(1.0000002)
    fmt.Println("a == b?", a == b) // Might be true due to precision
}

输出显示了 float32 如何在非常大或非常小的数字上丢失精度。相等性比较演示了计算中潜在的精度问题。

使用 float32 进行数学运算

Float32 支持所有标准数学运算。此示例展示了各种运算,包括 math 包中的运算。

math_operations.go
package main

import (
    "fmt"
    "math"
)

func main() {

    x := float32(9.0)
    y := float32(4.0)
    
    // Basic operations
    fmt.Println("x + y =", x+y)
    fmt.Println("x - y =", x-y)
    fmt.Println("x * y =", x*y)
    fmt.Println("x / y =", x/y)
    
    // Math functions require type conversion
    fmt.Println("Sqrt(x) =", float32(math.Sqrt(float64(x))))
    fmt.Println("Pow(x, y) =", float32(math.Pow(float64(x), float64(y))))
}

基本算术可以直接与 float32 一起使用,但数学函数需要转换为 float64。这显示了精度和内存之间的权衡。

比较 float32 值

由于精度问题,比较浮点数需要格外小心。此示例演示了正确的比较技术。

comparison.go
package main

import (
    "fmt"
    "math"
)

const epsilon = 1e-6 // Small threshold for comparison

func main() {

    a := float32(0.1)
    b := float32(0.2)
    c := float32(0.3)
    
    // Problematic direct comparison
    fmt.Println("a + b == c?", a+b == c)
    
    // Better approach using epsilon
    sum := a + b
    diff := float32(math.Abs(float64(sum - c)))
    fmt.Println("Approximately equal?", diff < epsilon)
    
    // Special values
    nan := float32(math.NaN())
    inf := float32(math.Inf(1))
    fmt.Println("Is NaN?", math.IsNaN(float64(nan)))
    fmt.Println("Is Inf?", math.IsInf(float64(inf), 1))
}

由于舍入误差,直接相等性比较通常会失败。使用 epsilon 阈值更可靠。该示例还展示了特殊值的处理。

数组和切片中的 Float32

Float32 通常用于集合中以提高内存效率。此示例演示了具有常见运算的 float32 数组和切片。

collections.go
package main

import "fmt"

func main() {

    // Array of float32
    temps := [5]float32{21.5, 22.1, 23.8, 24.2, 25.0}
    
    // Slice of float32
    readings := []float32{98.6, 99.2, 100.1, 101.3}
    
    // Calculate average
    var sum float32
    for _, temp := range temps {
        sum += temp
    }
    avg := sum / float32(len(temps))
    fmt.Printf("Average temp: %.1f°C\n", avg)
    
    // Append to slice
    readings = append(readings, 102.0, 103.5)
    fmt.Println("Updated readings:", readings)
    
    // Multi-dimensional
    matrix := [2][2]float32{{1.2, 3.4}, {5.6, 7.8}}
    fmt.Println("Matrix:", matrix)
}

Float32 数组和切片与其他类型的工作方式类似。该示例展示了迭代、追加和多维用法。Float32 常用于数值计算。

来源

Go 语言规范

本教程通过算术运算、比较和集合用法的实际示例,涵盖了 Go 中的 `float32` 类型。

作者

我叫 Jan Bodnar,是一名充满激情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出所有 Golang 教程