ZetCode

Golang float64 类型

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

本教程将解释如何在 Go 中使用 float64 内置类型。我们将通过实际的数值计算示例来介绍浮点数基础知识。

float64 类型代表 Go 中的 64 位浮点数。它提供约 15 位十进制精度,是浮点数字面量的默认类型。Float64 适用于大多数数值计算。

在 Go 中,float64 实现 IEEE 754 浮点数运算标准。它可以表示大约 1.7E-308 到 1.7E+308 范围内的值。像 NaN 和 Inf 这样的特殊值也受支持。

基本的 float64 声明和初始化

使用 float64 的最简单方法是通过显式类型声明变量。此示例显示了 float64 变量的基本声明和初始化。

basic_float.go
package main

import "fmt"

func main() {

    var pi float64 = 3.141592653589793
    var e = 2.718281828459045 // Type inferred as float64
    
    fmt.Printf("pi: %v, type: %T\n", pi, pi)
    fmt.Printf("e: %v, type: %T\n", e, e)
    
    // Scientific notation
    avogadro := 6.02214076e23
    fmt.Println("Avogadro's number:", avogadro)
}

示例展示了创建 float64 变量的三种方式。第三种使用了科学计数法。所有没有后缀的浮点数字面量都是 float64。

Float64 算术运算

Float64 支持所有基本的算术运算。此示例演示了加法、减法、乘法、除法和取模运算。

float_arithmetic.go
package main

import "fmt"

func main() {

    a := 12.5
    b := 3.2
    
    fmt.Println("Addition:", a + b)
    fmt.Println("Subtraction:", a - b)
    fmt.Println("Multiplication:", a * b)
    fmt.Println("Division:", a / b)
    
    // Modulus using math.Mod
    fmt.Println("Modulus:", math.Mod(a, b))
    
    // Compound assignment
    a += b
    fmt.Println("After +=:", a)
}

示例展示了 float64 的基本算术运算。请注意,取模运算需要使用 math.Mod 函数。复合赋值运算符按预期工作。

比较 float64 值

由于精度问题,比较浮点数需要特别小心。此示例演示了 float64 值的安全比较技术。

float_comparison.go
package main

import (
    "fmt"
    "math"
)

func main() {

    a := 0.1 + 0.2
    b := 0.3
    
    // Naive comparison (may fail)
    fmt.Println("Naive comparison:", a == b)
    
    // Safe comparison with tolerance
    tolerance := 1e-10
    diff := math.Abs(a - b)
    fmt.Println("Safe comparison:", diff < tolerance)
    
    // Special values comparison
    nan := math.NaN()
    inf := math.Inf(1)
    fmt.Println("NaN == NaN:", nan == nan) // Always false
    fmt.Println("Is Inf:", math.IsInf(inf, 1))
}

示例展示了为什么直接相等比较通常在 float64 中会失败。它演示了使用容差值进行正确比较以及如何处理 NaN 和 Inf 等特殊值。

使用 float64 的数学函数

Go 的 math 包提供了许多操作 float64 的函数。此示例展示了标准库中可用的常见数学运算。

math_functions.go
package main

import (
    "fmt"
    "math"
)

func main() {

    x := 2.0
    y := 3.0
    
    fmt.Println("Square root:", math.Sqrt(x))
    fmt.Println("Power:", math.Pow(x, y))
    fmt.Println("Exponential:", math.Exp(x))
    fmt.Println("Natural log:", math.Log(x))
    fmt.Println("Sine:", math.Sin(math.Pi/x))
    
    // Rounding functions
    fmt.Println("Ceil:", math.Ceil(3.14))
    fmt.Println("Floor:", math.Floor(3.14))
    fmt.Println("Round:", math.Round(3.14))
}

math 包为 float64 运算提供了全面的支持。这包括基本算术、三角函数、对数和舍入函数。所有数学函数都使用 float64 参数并返回值。

Float64 精度和格式化

格式化 float64 值需要理解其精度限制。此示例演示了 float64 输出的不同格式化选项。

float_formatting.go
package main

import "fmt"

func main() {

    value := 123.45678901234567
    
    // Default formatting
    fmt.Println("Default:", value)
    
    // Precision control
    fmt.Printf("2 decimal places: %.2f\n", value)
    fmt.Printf("Scientific notation: %e\n", value)
    fmt.Printf("Large exponent: %g\n", value*1e30)
    
    // String formatting options
    fmt.Printf("Width 10, precision 4: %10.4f\n", value)
    fmt.Printf("Left aligned: %-10.2f|\n", value)
}

示例展示了格式化 float64 值的各种方法。printf 动词 %f、%e 和 %g 提供了不同的格式化样式。可以控制精度和宽度以获得更好的输出呈现。

来源

Go 语言规范

本教程通过实际的数值计算和格式化示例,介绍了 Go 中的 float64 类型。

作者

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

列出所有 Golang 教程