go 的 math 包函数是纯函数,只接受 float64 类型,不自动转换;遵循 ieee 754 标准,返回 nan/inf 而非 panic;三角函数用弧度;取整函数行为各异,需按语义选用。

Go 的 math 包函数不是“运行”出来的,而是直接调用、立即返回结果的纯函数;它不启动协程、不阻塞、不依赖外部状态,但必须传 float64 类型,否则编译失败或运行时 panic(比如传 int 会报类型不匹配)。
math 函数为什么只收 float64?
所有 math 函数签名都限定为 float64 输入和输出,这是 Go 标准库的明确设计——不自动类型转换,也不提供泛型重载(截至 Go 1.26)。这意味着:
- 传
int、int64或float32都必须显式转换,例如math.Sqrt(float64(x)),否则编译报错cannot use x (type int) as type float64 -
math.Pow(2, 3)看似整数,实际是math.Pow(2.0, 3.0);若变量是int,不转就过不了编译 - 没有
math.Max(int, int)版本;想比较两个int,得写int(math.Max(float64(a), float64(b))),注意溢出风险
负数开方、除零、log 负数会怎样?
math 包严格遵循 IEEE 754 浮点标准,不 panic,而是返回定义好的特殊值:
-
math.Sqrt(-1)→ 返回NaN(Not a Number),后续对NaN的任何算术运算仍得NaN -
math.Log(-1)→ 同样返回NaN;对数底数或真数为负/零均未定义 -
1.0 / 0.0→ 得+Inf,-1.0 / 0.0→-Inf;0.0 / 0.0→NaN - 用
math.IsNaN()或math.IsInf()主动检测,别靠==判断(NaN == NaN永远是false)
三角函数单位是弧度,不是角度
所有三角函数如 math.Sin、math.Cos、math.Atan2 全部以弧度为单位,误用角度会导致结果完全错误:
- 要算 90° 的正弦,得写
math.Sin(math.Pi / 2),而不是math.Sin(90) - 角度转弧度:乘
math.Pi / 180;弧度转角度:乘180 / math.Pi -
math.Asin(1)返回1.5707963267948966(即 π/2),不是 90 —— 它仍是弧度,需自行转 - 没有内置角度版函数;封装一个
SinDeg(d float64) float64 { return math.Sin(d * math.Pi / 180) }更安全
取整函数选哪个?Floor/Ceil/Trunc/Round 含义不同
Go 的取整函数行为差异明显,不能凭名字直觉使用:
-
math.Floor(-2.7)→-3.0(向下取整,朝 -∞) -
math.Ceil(-2.7)→-2.0(向上取整,朝 +∞) -
math.Trunc(-2.7)→-2.0(截断小数,等价于向零取整) -
math.Round(-2.7)→-3.0(四舍五入到最近整数,.5 向偶数舍入) - 想实现“正数向上、负数向下”的对称取整?没有现成函数,得自己写:
if x >= 0 { return math.Ceil(x) } else { return math.Floor(x) }
最容易被忽略的是:所有结果仍是 float64,即使看起来像整数(如 math.Floor(3.0) 返回 3.0),需要转 int 时务必确认不会溢出,并处理 NaN/Inf 场景。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











