Like Share Discussion Bookmark Smile

J.J. Huang   2025-01-19   Getting Started Golang 01.基本型別   瀏覽次數:次   DMCA.com Protection Status

Go | 初步了解「浮點」型別

💬 簡介

在 Go 語言中,浮點型別(float32float64)用於表示有小數部分的數字。
它們是數值型別的一部分,與整數型別(intuint)不同,浮點數型別能夠存儲帶小數的數字,廣泛應用於需要數學運算、科學計算以及數字處理的場景。

本文將介紹 Go 語言中的浮點型別,並深入探討它們的使用方法、範圍、精度以及常見的應用場景。

圖片來源:Gophers(地鼠造型的原創者為 Renee French)


🔎 Go 語言中的浮點型別

有兩種主要的浮點型別:float32float64,它們分別使用 32 位元和 64 位元來表示數字。float64 是預設的浮點型別,通常具有較高的精度,因此在大多數情況下,float64 會是首選型別。

1️⃣ float32float64 比較

  • float32:佔用 4 位元組(32 位),適用於較低精度要求的運算,範圍較小。
  • float64:佔用 8 位元組(64 位),適用於需要較高精度的運算,範圍較大。

範圍與精度

  • float32 具有大約 7 位數字的精度,範圍約從 1.4e-453.4e+38

    📝 科學記號解釋:

    • 1.4e-45 表示 1.4 乘以 10-45 次方,等於 0.000...00014,其中有 45 個零在小數點後。
    • 3.4e+38 表示 3.4 乘以 1038 次方,等於 34000000000000000000000000000000000000,即 34 後面有 37 個零。
  • float64 具有大約 15 位數字的精度,範圍約從 5.0e-3241.8e+308

2️⃣ 浮點型別範圍與應用

Go 語言的浮點型別主要用於表示實數和進行高精度的計算,並且適合用來表示科學計算中的數字。

  • 範例:使用浮點型別
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    package main

    import "fmt"

    func main() {
    var a float32 = 3.14
    var b float64 = 2.718281828459045

    fmt.Println("float32 的值:", a)
    fmt.Println("float64 的值:", b)
    }

    📝在這個範例中,a 使用了 float32 型別,b 使用了 float64 型別,顯示了兩者的不同。

3️⃣ 浮點數精度問題

由於浮點數型別的存儲方式,浮點數並不是完全精確的,尤其是當需要表示非常小或非常大的數字時,可能會出現精度丟失的情況。

  • 範例:浮點數精度問題
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    package main

    import "fmt"

    func main() {
    var a float64 = 0.1
    var b float64 = 0.2
    var sum float64 = a + b

    fmt.Println("0.1 + 0.2 的結果是:", sum) // 輸出 0.30000000000000004
    }

    📝在這個範例中,儘管我們期望 0.1 + 0.2 等於 0.3,但由於浮點數的精度問題,結果為 0.30000000000000004。

4️⃣ 浮點數運算

各種浮點數運算,包括加法、減法、乘法、除法等。需要注意的是,浮點數的運算結果可能會受到精度影響,尤其在處理極大或極小的數字時。

  • 範例:浮點數運算
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    package main

    import "fmt"

    func main() {
    var x float64 = 10.5
    var y float64 = 2.5

    sum := x + y
    diff := x - y
    product := x * y
    quotient := x / y

    fmt.Println("加法結果:", sum) // 輸出 13
    fmt.Println("減法結果:", diff) // 輸出 8
    fmt.Println("乘法結果:", product) // 輸出 26.25
    fmt.Println("除法結果:", quotient) // 輸出 4.2
    }

    📝在這個範例中,展示了浮點數的基本運算,並計算了加、減、乘、除的結果。


⚠️ 注意事項

1️⃣ 浮點數比較

由於浮點數的精度問題,直接比較兩個浮點數是否相等可能會得到錯誤的結果。通常,應使用一個容忍範圍來檢查浮點數是否接近。

  • 範例:浮點數比較
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    package main

    import "fmt"
    import "math"

    func main() {
    a := 0.1 + 0.2
    b := 0.3
    tolerance := 1e-9 // 容忍範圍

    if math.Abs(a-b) < tolerance {
    fmt.Println("兩個浮點數相等")
    } else {
    fmt.Println("兩個浮點數不相等")
    }
    }

    📝在這個範例中,我們使用 math.Abs 函式來計算兩個浮點數之間的差異,並將其與容忍範圍進行比較。

2️⃣ 注意溢位與精度損失

雖然浮點型別可以表示極大或極小的數字,但在運算過程中,依然可能會發生溢位或精度損失。因此,選擇適當的型別和容忍範圍對於高精度計算至關重要。


🎯總結

浮點型別是處理實數數值運算時不可或缺的工具。float32float64 分別提供不同範圍和精度的浮點數存儲方式。
了解浮點數的範圍、精度和運算特性,有助於選擇最適合的型別來處理需要小數的數值。

最後,應該注意浮點數的精度問題,並在比較浮點數時採取合理的容忍範圍,避免因為浮點數的限制而出現錯誤的結果。

最後建議回顧一下 Go | 菜鳥教學 目錄,了解其章節內容。


註:以上參考了
Go