Go | 初步了解「浮點」型別
💬 簡介
在 Go 語言中,浮點型別(float32
和 float64
)用於表示有小數部分的數字。
它們是數值型別的一部分,與整數型別(int
和 uint
)不同,浮點數型別能夠存儲帶小數的數字,廣泛應用於需要數學運算、科學計算以及數字處理的場景。
本文將介紹 Go 語言中的浮點型別,並深入探討它們的使用方法、範圍、精度以及常見的應用場景。
圖片來源:Gophers(地鼠造型的原創者為 Renee French)
🔎 Go 語言中的浮點型別
有兩種主要的浮點型別:float32
和 float64
,它們分別使用 32 位元和 64 位元來表示數字。float64
是預設的浮點型別,通常具有較高的精度,因此在大多數情況下,float64
會是首選型別。
1️⃣ float32
與 float64
比較
float32
:佔用 4 位元組(32 位),適用於較低精度要求的運算,範圍較小。float64
:佔用 8 位元組(64 位),適用於需要較高精度的運算,範圍較大。
範圍與精度
float32
具有大約 7 位數字的精度,範圍約從1.4e-45
到3.4e+38
。📝 科學記號解釋:
1.4e-45
表示1.4
乘以10
的-45
次方,等於0.000...00014
,其中有 45 個零在小數點後。3.4e+38
表示3.4
乘以10
的38
次方,等於34000000000000000000000000000000000000
,即34
後面有 37 個零。
float64
具有大約 15 位數字的精度,範圍約從5.0e-324
到1.8e+308
。
2️⃣ 浮點型別範圍與應用
Go 語言的浮點型別主要用於表示實數和進行高精度的計算,並且適合用來表示科學計算中的數字。
- 範例:使用浮點型別
1
2
3
4
5
6
7
8
9
10
11package 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
11package 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
18package 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
16package 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️⃣ 注意溢位與精度損失
雖然浮點型別可以表示極大或極小的數字,但在運算過程中,依然可能會發生溢位或精度損失。因此,選擇適當的型別和容忍範圍對於高精度計算至關重要。
🎯總結
浮點型別是處理實數數值運算時不可或缺的工具。float32
和 float64
分別提供不同範圍和精度的浮點數存儲方式。
了解浮點數的範圍、精度和運算特性,有助於選擇最適合的型別來處理需要小數的數值。
最後,應該注意浮點數的精度問題,並在比較浮點數時採取合理的容忍範圍,避免因為浮點數的限制而出現錯誤的結果。
最後建議回顧一下 Go | 菜鳥教學 目錄,了解其章節內容。
註:以上參考了
Go