ZetCode

Golang strconv.ParseFloat

最后修改于 2025 年 4 月 20 日

本教程将解释如何在 Go 中使用 strconv.ParseFloat 函数。我们将通过实际示例介绍字符串到浮点数的转换基础。

strconv.ParseFloat 函数将字符串转换为浮点数。它对于解析可能包含小数点的数值输入至关重要。

ParseFloat 接受表示十进制或科学记数法中浮点数的字符串。它返回两个值:解析后的浮点数和一个错误。这遵循 Go 的错误处理模式。

基本的 strconv.ParseFloat 示例

strconv.ParseFloat 最简单的用法是将数字字符串转换为浮点数。在这里,我们演示了成功的转换和错误处理。

basic_parsefloat.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    numStr := "3.1415"
    
    num, err := strconv.ParseFloat(numStr, 64)
    if err != nil {
        fmt.Println("Conversion error:", err)
        return
    }
    
    fmt.Printf("String '%s' converted to float %f\n", numStr, num)
}

我们将字符串 "3.1415" 转换为 float64。检查错误以处理转换失败的情况。成功的转换会打印浮点值。

处理转换错误

strconv.ParseFloat 对无效的数字字符串返回错误。此示例显示了对不同输入情况的正确错误处理。

error_handling.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    testCases := []string{"3.14", "1.5e2", "abc", "123.45.67", ""}
    
    for _, tc := range testCases {
        num, err := strconv.ParseFloat(tc, 64)
        if err != nil {
            fmt.Printf("'%s' is not a valid float: %v\n", tc, err)
        } else {
            fmt.Printf("'%s' converted to %f\n", tc, num)
        }
    }
}

我们测试了各种字符串输入,包括有效和无效的情况。错误消息有助于识别每个无效输入的转换失败原因。

转换用户输入

一个常见的用例是转换命令行参数或用户输入。此示例演示了从标准输入读取和转换数字。

user_input.go
package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
    "strings"
)

func main() {
    reader := bufio.NewReader(os.Stdin)
    
    fmt.Print("Enter a floating-point number: ")
    input, _ := reader.ReadString('\n')
    input = strings.TrimSpace(input)
    
    num, err := strconv.ParseFloat(input, 64)
    if err != nil {
        fmt.Println("Please enter a valid floating-point number")
        return
    }
    
    fmt.Printf("You entered: %f (square: %f)\n", num, num*num)
}

我们读取用户输入,去除空格,然后尝试转换。程序会为无效输入提供反馈,并演示使用转换后的值。

使用不同的位大小

根据 bitSize 参数,ParseFloat 可以返回 float32 或 float64 值。此示例同时展示了这两种方法。

bit_sizes.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    numStr := "123.45678901234567890"
    
    // 32-bit float
    num32, _ := strconv.ParseFloat(numStr, 32)
    fmt.Printf("32-bit float: %f\n", num32)
    
    // 64-bit float
    num64, _ := strconv.ParseFloat(numStr, 64)
    fmt.Printf("64-bit float: %f\n", num64)
    
    fmt.Printf("Precision difference: %.20f vs %.20f\n", num32, num64)
}

bitSize 参数(32 或 64)决定了返回值的精度。Float64 提供更高的精度,但比 float32 使用更多的内存。

科学记数法支持

ParseFloat 支持科学记数法。此示例演示了转换科学格式的数字。

scientific_notation.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    scientificNumbers := []string{"1.23e3", "1.23E3", "1e-5", "-2.5e-2"}
    
    for _, sn := range scientificNumbers {
        num, err := strconv.ParseFloat(sn, 64)
        if err != nil {
            fmt.Printf("Failed to parse '%s': %v\n", sn, err)
        } else {
            fmt.Printf("'%s' = %f\n", sn, num)
        }
    }
}

科学记数法(使用 'e' 或 'E')通常用于非常大或非常小的数字。ParseFloat 同时处理正负指数。

替代方案:fmt.Sscanf

fmt.Sscanf 提供了另一种从字符串解析浮点数的方法。此示例将其与 ParseFloat 进行比较。

sscanf.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    numStr := "3.14159"
    
    // Using ParseFloat
    num1, err1 := strconv.ParseFloat(numStr, 64)
    if err1 != nil {
        fmt.Println("ParseFloat error:", err1)
    } else {
        fmt.Println("ParseFloat result:", num1)
    }
    
    // Using Sscanf
    var num2 float64
    _, err2 := fmt.Sscanf(numStr, "%f", &num2)
    if err2 != nil {
        fmt.Println("Sscanf error:", err2)
    } else {
        fmt.Println("Sscanf result:", num2)
    }
}

SscanfParseFloat 更灵活但速度更慢。对于简单的浮点数转换,请使用 ParseFloat;对于更复杂的解析需求,请使用 Sscanf

实际示例:计算平均值

这个实际示例演示了如何使用 ParseFloat 来计算命令行参数中数字的平均值。

average.go
package main

import (
    "fmt"
    "os"
    "strconv"
)

func main() {
    if len(os.Args) < 2 {
        fmt.Println("Please provide numbers to average")
        return
    }
    
    var sum float64
    count := len(os.Args[1:])
    
    for _, arg := range os.Args[1:] {
        num, err := strconv.ParseFloat(arg, 64)
        if err != nil {
            fmt.Printf("'%s' is not a valid number\n", arg)
            return
        }
        sum += num
    }
    
    average := sum / float64(count)
    fmt.Printf("Average: %.2f\n", average)
}

我们遍历命令行参数,将每个参数转换为浮点数,然后计算平均值。无效的数字会导致程序因错误而终止。

来源

Go strconv 包文档

本教程通过各种场景下的字符串到浮点数转换的实际示例,介绍了 Go 中的 strconv.ParseFloat 函数。

作者

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

列出所有 Go 教程