ZetCode

Golang FloatType

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

本教程将解释如何在 Go 中使用 FloatType 内置类型。我们将通过实际示例介绍浮点数基础知识,以及处理浮点数的操作。

Go 中的 FloatType 表示浮点数。Go 提供了两种浮点数类型:float32float64。这些类型遵循 IEEE 754 标准进行浮点数运算。

浮点数用于表示带有小数部分的实数。它们对于科学计算、图形和金融应用至关重要,因为这些领域精度很重要。

基础浮点数声明和初始化

在 Go 中使用浮点数的最简单方法是声明和初始化变量。此示例展示了基础浮点数操作。
注意: 除非显式指定类型,否则浮点文字量默认使用 float64。

basic_float.go
package main

import "fmt"

func main() {

    var f1 float32 = 3.14
    f2 := 2.71828 // float64 by default
    
    fmt.Printf("f1 (float32): %v, type: %T\n", f1, f1)
    fmt.Printf("f2 (float64): %v, type: %T\n", f2, f2)
    
    sum := f1 + float32(f2) // Type conversion needed
    fmt.Println("Sum:", sum)
}

此示例展示了 float32 和 float64 的声明。请注意,在操作中混合使用不同浮点类型时需要进行类型转换。

浮点数精度和舍入

浮点数具有有限的精度。此示例演示了浮点数的精度问题和舍入操作。

float_precision.go
package main

import (
    "fmt"
    "math"
)

func main() {

    a := 1.0 / 3.0
    fmt.Println("1/3 as float64:", a) // Shows precision limit
    
    b := float32(1.0 / 3.0)
    fmt.Println("1/3 as float32:", b) // Less precise
    
    rounded := math.Round(a*100) / 100
    fmt.Println("Rounded to 2 decimal places:", rounded)
    
    // Comparing floats safely
    epsilon := 1e-9
    if math.Abs(0.1+0.2-0.3) < epsilon {
        fmt.Println("0.1 + 0.2 equals 0.3 within tolerance")
    }
}

此示例展示了 float32 的精度如何低于 float64。它演示了浮点数的舍入和安全比较技术。

浮点数的数学运算

Go 的 math 包提供了许多用于浮点数运算的函数。此示例展示了浮点数的常用数学运算。

math_operations.go
package main

import (
    "fmt"
    "math"
)

func main() {

    x := 16.0
    y := 3.0
    
    fmt.Println("Square root:", math.Sqrt(x))
    fmt.Println("Power:", math.Pow(x, y))
    fmt.Println("Sine:", math.Sin(math.Pi/y))
    fmt.Println("Logarithm:", math.Log(x))
    fmt.Println("Ceiling:", math.Ceil(x/y))
    fmt.Println("Floor:", math.Floor(x/y))
}

此示例演示了 math 包中的各种数学函数。这些函数默认使用 float64 值。

特殊浮点数值

浮点数可以表示无穷大和 NaN(非数字)等特殊值。此示例展示了如何处理这些特殊情况。

special_values.go
package main

import (
    "fmt"
    "math"
)

func main() {

    posInf := math.Inf(1)
    negInf := math.Inf(-1)
    nan := math.NaN()
    
    fmt.Println("Positive infinity:", posInf)
    fmt.Println("Negative infinity:", negInf)
    fmt.Println("NaN:", nan)
    
    // Checking for special values
    fmt.Println("Is infinity:", math.IsInf(posInf, 1))
    fmt.Println("Is NaN:", math.IsNaN(nan))
    
    // Operations with special values
    fmt.Println("Inf + 5:", posInf+5)
    fmt.Println("Inf * 0:", posInf*0) // Results in NaN
}

此示例演示了特殊浮点值的创建和检测。它展示了这些值在数学运算中的行为。

格式化浮点数

格式化浮点数以进行显示需要仔细考虑。此示例展示了 Go 中的不同格式化选项。

formatting.go
package main

import "fmt"

func main() {

    pi := 3.141592653589793
    
    // Default formatting
    fmt.Println("Default:", pi)
    
    // Precision control
    fmt.Printf("2 decimal places: %.2f\n", pi)
    fmt.Printf("6 decimal places: %.6f\n", pi)
    
    // Scientific notation
    fmt.Printf("Scientific: %e\n", pi)
    fmt.Printf("Scientific (capital E): %E\n", pi)
    
    // Automatic format selection
    fmt.Printf("Auto: %g\n", pi)
    fmt.Printf("Auto (large number): %g\n", pi*1e15)
    
    // Width and padding
    fmt.Printf("|%10.3f|\n", pi) // Right-aligned
    fmt.Printf("|%-10.3f|\n", pi) // Left-aligned
}

此示例演示了浮点数的各种格式化动词。这些包括精度控制、科学计数法和对齐选项。

来源

Go 语言规范

本教程通过浮点数运算、精度处理和格式化的实际示例,介绍了 Go 中的 FloatType。

作者

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

列出所有 Golang 教程