math包严格遵循IEEE 754标准,负数开方如math.Sqrt(-1)返回NaN而非panic;NaN需用math.IsNaN判断,否则链式计算被污染;整数转换应避免float64→int路径以防精度丢失或静默错误。

math 包不是“开箱即用”的计算器,它要求你明确数值语义——类型、范围、特殊值都得自己兜底。写错就编译失败,算错也不报 panic,只静默返回 NaN 或 Inf。
math.Sqrt 和负数开方为什么没报错?
math.Sqrt(-1) 返回 NaN,不是 panic,也不是 0。这是 IEEE 754 的规定,Go 完全遵循。
- 所有输入为负的超越函数(
math.Log、math.Acos、math.Asinh等)都可能返回NaN或Inf -
NaN == NaN永远是false,所以不能用==判断,必须用math.IsNaN(x) - 一旦出现
NaN,后续链式计算大概率继续污染:比如int(math.Sqrt(-1))得到 0,但这个 0 没有任何业务含义 - 安全写法是前置校验:
if x ,或封装成 <code>safeSqrt
math.Pow(2, 3) 为什么会编译失败?
因为 math.Pow 只接受 float64,而 2 和 3 是 untyped int 常量,Go 不做隐式转换。
-
math.Pow(2, 3)❌ 编译错误:cannot use 2 (type int) as type float64 in argument to math.Pow -
math.Pow(2.0, 3.0)✅ 正确 -
math.Pow(float64(2), float64(3))✅ 也正确,适合变量场景 - 小整数幂(如平方、立方)强烈建议直接写
x * x或x * x * x:更快、无浮点误差、不触发NaN(比如math.Pow(-2.0, 0.5)就是NaN)
math.Sin 怎么传 30 度?
所有三角函数参数单位都是弧度,不是角度。别直接传 30,得先换算。
-
math.Sin(30)❌ 算的是 30 弧度(约 1718°)的正弦,不是你要的 -
math.Sin(30 * math.Pi / 180)✅ 正确:角度转弧度公式 - 反三角函数返回值也是弧度,比如
math.Asin(0.5)返回约0.5236(即 π/6),不是 30 - 如果最终要角度,记得再转回来:
math.Asin(0.5) * 180 / math.Pi
math.Floor(9999999999999999.0) 转 int 为什么可能出错?
math.Floor 返回仍是 float64,而大整数在 float64 中无法精确表示,强制转 int 会因精度丢失翻车。
-
int(math.Floor(9999999999999999.0))可能变成10000000000000000(多 1) - 根本原因:
float64对 >2⁵³ 的整数无法保精度,9999999999999999 已超此限 - 安全做法:若确定输入是整数范围内的值,用
int(math.Round(x));若需严格向下取整且防溢出,加微小偏移:int(math.Floor(x + 1e-9)) - 更稳妥的方式是避免走 float64 → int 这条路:整数运算尽量用原生
int类型,别绕道math.Max或math.Floor
最常被忽略的不是函数怎么调,而是 math.IsNaN 检查没加——一个没拦住的 NaN 从开方流进数据库 ID 生成逻辑,线上服务就 quietly 崩了。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











