
Go 标准库 math/big 提供了 (*Int).Sqrt 方法,可直接对任意精度的大整数计算非负整数平方根(向下取整),无需手动实现牛顿迭代或外部依赖。
go 标准库 math/big 提供了 `(*int).sqrt` 方法,可直接对任意精度的大整数计算非负整数平方根(向下取整),无需手动实现牛顿迭代或外部依赖。
在处理远超 int64 范围的整数(如密码学、大数运算或高精度金融计算)时,*big.Int 是 Go 中的标准选择。然而,与基础类型不同,big.Int 不支持直接调用 math.Sqrt——该函数仅接受 float64,且会因精度丢失导致严重错误(例如 10^60 转为 float64 后有效数字不足 17 位)。
幸运的是,math/big 包原生提供了安全、精确的整数平方根方法:(*big.Int).Sqrt(z *big.Int)。它接收一个 *big.Int 参数 z,将 z 的非负整数平方根(即 ⌊√z⌋) 写入调用者自身,并返回 *big.Int(即 z 的平方根值)。注意:该方法不修改原输入对象,而是将结果存入接收者(调用方 *big.Int 实例),因此需确保接收者已初始化。
以下是一个完整、健壮的使用示例:
package main
import (
"fmt"
"math/big"
)
func main() {
// 从字符串安全解析超大整数(避免字面量溢出)
s := "10000000000000000000000000000000000000000000000000000"
z := new(big.Int)
if _, ok := z.SetString(s, 10); !ok {
panic("invalid number string")
}
// 计算平方根:结果写入 sqrt,sqrt 本身被复用作接收者
sqrt := new(big.Int).Sqrt(z)
fmt.Printf("√%s = %s\n", z.String(), sqrt.String())
// 输出:√10000000000000000000000000000000000000000000000000000 = 100000000000000000000000000
}? 关键注意事项:
- ✅
Sqrt返回的是向下取整的整数平方根(floor(√z)),适用于所有z ≥ 0;若z ,行为未定义(应提前校验)。 - ✅ 接收者
*big.Int可复用(如new(big.Int).Sqrt(z)),也可复用已有变量(如var sqrt big.Int; sqrt.Sqrt(z)),更省内存。 - ❌ 切勿尝试先转
float64再用math.Sqrt——big.Int的精度远超float64,转换必然丢精度,结果不可信。 - ? 若需更高精度(如小数部分),应使用
big.Float配合SetPrec和Sqrt方法,但这是另一套 API。
综上,(*big.Int).Sqrt 是 Go 中处理大整数开方的标准、高效、零依赖方案,正确使用可确保全程无精度损失,完全满足高可靠性场景需求。

















