math包函数要求严格类型匹配且无隐式转换,参数必须为float64;三角函数以弧度为单位;Max/Min不适用于整数比较;NaN和Inf会静默传播,需主动检测。

math.Sqrt、math.Pow 等函数为什么一用就报错?
因为 math 包所有函数只接受 float64 类型参数,传 int、int64 或 float32 都会编译失败。这不是运行时错误,是编译器直接拦住你。
-
math.Sqrt(16)❌ 报错:cannot use 16 (type int) as type float64 - 正确写法:
math.Sqrt(16.0)或math.Sqrt(float64(16)) -
math.Pow(2, 3)❌ 同样错;必须写成math.Pow(2.0, 3.0) -
math.Sin(float32(1.57))❌ 类型不匹配;得写math.Sin(float64(1.57))
别指望隐式转换——Go 不干这事。类型不对,编译就过不去。
三角函数总算不准?角度和弧度搞混了
math.Sin、math.Cos、math.Asin 等所有三角相关函数,输入单位全是弧度,不是角度。直接传 30 当 30° 用,结果完全不可信。
- 30° 要先转弧度:
30 * math.Pi / 180,再传给math.Sin - 反三角函数(如
math.Acos)返回值也是弧度,想转回角度还得再乘180 / math.Pi -
math.Asin和math.Acos只接受 [-1, 1] 区间值,越界返回NaN,不 panic,但下游可能静默崩掉 - 推荐用
math.Atan2(y, x)替代math.Atan(y/x),它能自动处理象限,更鲁棒
math.Max、math.Min 和取整函数怎么用才不翻车?
math.Max 和 math.Min 只支持 float64,不能直接比两个 int。强行转再转回,有精度风险(比如大整数转 float64 会丢精度)。
立即学习“go语言免费学习笔记(深入)”;
- 比较两个整数,别绕路:
if a > b { return a }比int(math.Max(float64(a), float64(b)))更安全、更快 -
math.Floor、math.Ceil返回仍是float64,转int要用int(math.Floor(x)),不能int(x)强转(浮点误差可能导致截断偏差) -
math.Round是四舍五入到最近整数,半整数向偶数舍(如math.Round(2.5)→ 2,math.Round(3.5)→ 4) -
math.Trunc是简单截断小数部分,math.Trunc(-4.9)得 -4,和math.Floor行为不同
NaN 和 Inf 不报错,才是线上最危险的坑
math 包对非法输入从不 panic,而是静默返回特殊值:math.Sqrt(-1) → NaN,math.Log(0) → -Inf。这些值参与后续计算,可能一路污染到最终结果,且难以定位。
- 务必在关键路径检查:
if math.IsNaN(result)或if math.IsInf(x, 0) - 开方前主动判断:
if x - 对数前检查:
if x - 别用
==判断 NaN:NaN == NaN永远是false,只能用math.IsNaN()
最容易被忽略的不是“怎么算”,而是“算出来是不是有效”。数值逻辑一旦开始返回 NaN,就像漏水的水管,越往后越难堵。










