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 会丢精度)。