SCSS 中 math.div() 报错需先 @use "sass:math" 显式导入并用命名空间调用;/ 是编译期运算符,易受除法上下文影响,math.div() 更安全确定;math.round() 精度问题源于浮点误差与单位处理。
math.div() 报错:不是函数?你升级到 Dart Sass 1.33+ 后,直接写 100px / 2 还能用,但一调 math.div(100px, 2) 就报 Function "math.div" not found —— 这不是你装错了,是 Dart Sass 默认禁用了旧式数学函数库。从 1.33 开始,math 模块必须显式加载,且不自动挂载到全局命名空间。
解决方法很简单:
@use "sass:math"(注意不是 @import)math.div($a, $b),不能省略 math.
_index.scss)里 @use "sass:math" as math,然后所有子模块通过 @use 继承即可math.div() 和除法运算符 / 到底该用哪个?两者行为不同,选错会导致意料之外的单位处理或类型错误。
/ 是编译期运算符,会触发“除法上下文”规则:当左侧不是数字、或右侧不是纯数字时,它可能被当作 CSS 除法(比如 font: 10px/2),导致编译失败或静默跳过math.div($a, $b) 是确定性函数,只做数值除法,单位自动保留(math.div(100px, 2) → 50px),且支持任意单位组合(只要可除,如 math.div(100px, 2em) 返回无量纲数)math.div();纯字面量且上下文明确(如 line-height: 1.5)才用 /
math.round() 对小数结果不准?这不是 bug,是浮点精度 + 单位隐式转换共同导致的。Dart Sass 的 math.round() 接收的是数值(number),不关心单位;但如果你传入带单位的值(如 3.75px),它先剥离单位计算,再把单位拼回去 —— 中间过程可能有微小误差。
立即学习“前端免费学习笔记(深入)”;
math.round(10.499999999999998px) 有时返回 10px,有时 11px(取决于底层 IEEE 754 表示)math.floor() 或 math.ceil() 做前置截断,或用 math.abs($x - round($x)) 手动容错
math.round(),改用整数比例设计,或用 clamp() + 固定步长兜底divide() 和 round()?Dart Sass 已彻底移除全局函数 divide()、round()、floor() 等,它们不再存在于 sass:math 中 —— 全部重命名为 math.div()、math.round()、math.floor()。
@forward "sass:math" 能恢复旧名,必须改调用方式divide(([^)]+)) → math.div($1)round(([^)]+)) → math.round($1)percentage() 未被移入 math,它仍在全局,但推荐改用 math.percentage()(Dart Sass 1.70+)以保持一致性最易被忽略的一点:@use 必须出现在文件最顶部,且不能被条件语句包裹;任何在 @use 之前出现的 math.xxx 调用都会直接报错,连 warning 都没有。