Like Share Discussion Bookmark Smile

J.J. Huang   2025-06-30   Getting Started Golang 07.套件   瀏覽次數:次   DMCA.com Protection Status

Go | 大數套件的函式與介紹

💬 簡介

Go 語言內建的 math/big 套件提供了對「任意精度運算(arbitrary-precision)」的支援。
這對於處理超過一般數值範圍的應用場景(如密碼學、金融計算、科學模擬)相當實用。

本篇將介紹 big.Int(大整數)與 big.Float(高精度浮點數)的使用方式與常見操作,讓你可以輕鬆進行高精度運算。

圖片來源:Gophers


💡 套件匯入與基本型別

1
2
3
4
import (
"fmt"
"math/big"
)
類型 功能說明
big.Int 任意精度整數
big.Float 任意精度浮點數(含小數)
big.Rat 有理數(分數)表示

🔢 建立大整數 big.Int

1
2
3
4
5
6
7
8
9
10
a := big.NewInt(1234567890123456789)
b := big.NewInt(9876543210)

// 加法(a + b)
sum := new(big.Int).Add(a, b)
fmt.Println("和:", sum)

// 乘法(a * b)
product := new(big.Int).Mul(a, b)
fmt.Println("積:", product)

使用 new(big.Int) 產生結果容器,避免原始變數被覆蓋。


📌 支援的基本操作函式

函式名稱 說明
Add(x, y) 相加
Sub(x, y) 相減
Mul(x, y) 相乘
Div(x, y) 相除(整數除法)
Mod(x, y) 取餘數
Exp(x, y, m) x^y mod m
Cmp(x) 比較(-1, 0, 1)

✳️ 建立高精度浮點數 big.Float

1
2
3
4
5
6
x := new(big.Float).SetFloat64(3.1415926535)
y := big.NewFloat(2.7182818284)

// 相加
z := new(big.Float).Add(x, y)
fmt.Println("π + e =", z)

預設精度為 53 bits(與 float64 相同),可透過 SetPrec() 設定更高精度。


🎯 高精度運算應用:複利計算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main

import (
"fmt"
"math/big"
)

func main() {
principal := big.NewFloat(1000.0) // 本金
rate := big.NewFloat(0.05) // 年利率 5%
years := 10

one := big.NewFloat(1)
growth := new(big.Float).Add(one, rate) // 1 + rate

result := new(big.Float).Set(principal)
for i := 0; i < years; i++ {
result.Mul(result, growth)
}

fmt.Printf("十年後資產:%.10f\n", result)
}

🧷 大整數的字串轉換

1
2
3
4
n := new(big.Int)
n.SetString("123456789012345678901234567890", 10)

fmt.Println("大整數:", n.String())
  • SetString(str, base):將字串轉為大整數,支援不同進位(2, 10, 16 等)
  • String():轉為字串輸出

🔍 常見用途場景

應用場景 適用類型 說明
密碼學運算 big.Int 大質數、模運算
精準金融計算 big.Float 銀行利息、累積誤差控制
科學數據模擬 big.Float 精密常數、多次運算避免誤差擴大
分數運算 big.Rat 有理數比例運算

⚠️ 注意事項

  • big.Intbig.Float 為參照型別,方法呼叫會修改自身值。
  • 所有數學運算皆為「傳入目的變數」風格,例如 z.Mul(x, y),而非 z = x * y
  • 若需避免變數覆蓋,建議每次建立新的 new(big.Int)new(big.Float) 結果容器。

🎯 總結

Go 的 math/big 套件是處理超大數值與高精度運算的強大工具:

  • ✅ 提供 big.Intbig.Floatbig.Rat 三種精確類型
  • ✅ 支援任意精度與進位制表示
  • ✅ 符合數學運算需求的函式介面
  • ✅ 適用於密碼學、科學計算、金融模型等領域

掌握這套工具,就能突破數值限制,開拓更精準的運算可能!

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


註:以上參考了
Go