应显式使用 math.div() 并按“先除→再 round→后加单位”顺序处理:#{round(math.div(14px, 16px), 3)}rem,避免 / 运算符和 @precision;ceil 适用于最小尺寸保障场景,所有间距需统一精度策略。

直接用 round() 截断小数位,别碰已废弃的 @precision 配置;单位参与运算时必须先除、再 round、最后加单位,否则结果不可控。
为什么 math.div() 结果带一堆小数位?
Dart Sass 的 math.div() 默认保留约 10 位小数,但浏览器解析 CSS 时只认 sub-pixel 级别精度,多出来的位数既无意义,又干扰调试。这不是计算错误,是默认行为——它不报错,但输出的 0.875rem 可能变成 0.8749999999rem,三层嵌套后字体 visibly 偏小。
- 必须显式导入:
@use "sass:math",调用写成math.div($a, $b) - 避免用
/运算符做变量除法,它受“除法上下文”影响,可能静默失败或误解析为 CSS 语法 -
math.div(14px, 16px)返回带单位值,但后续round()会剥离单位再拼回去,中间有浮点误差风险
怎么安全地 round 带单位的值?
不能写 round(14px / 16px, 3)rem——Sass 会先执行除法(可能触发上下文规则),再 round,最后加单位,单位参与运算易出错。
- 正确顺序:先数值计算 → 再
round→ 最后拼单位:#{round(math.div(14px, 16px), 3)}rem - 如果目标是 px 换算 rem,且项目用了
postcss-pxtorem,就别在 Sass 层转 rem,否则和插件双重转换,结果翻车 - 对百分比同理:
round(percentage(1/3), 5)→33.33333%,比直接percentage(1/3)更可控
ceil 或 floor 什么时候比 round 更合适?
当设计系统要求“最小可用尺寸”或“向上对齐像素”时,ceil() 比 round() 更可靠。比如栅格列宽必须 ≥ 某个阈值才能防 collapse,或 border-width 必须是整数像素才不模糊。
-
ceil(math.div(25px, 16px), 3)→1.563,确保不会因舍入变小 - 注意:
ceil(0.874)是1,不是0.875;若要保留小数位再向上取整,得先round($val, 3),再ceil($val) - 所有相关值(padding、gap、font-size)必须共用同一套源头变量,单点用
ceil而其他地方用round,整体比例仍会偏移
真正难的不是让 Sass 多输出几位小数,而是判断哪个环节该由编译期决定(比如固定间距的 px 换算),哪个环节必须交给运行时(比如依赖 var(--col-count) 的列宽)。精度控制必须落在具体表达式里,没有全局开关。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











