取整与余数:ROUND、INT、MOD 和取余套路

一、ROUND 与它的三个兄弟

负数取整最容易错的一步

=ROUND(数字,小数位数) 按四舍五入规则把数字保留到指定位数。第二参数为 2 时保留两位小数,为 0 时取整,为负数时向整数位取整,例如 =ROUND(1234.567,-2) 返回 1200,也就是精确到百位。

ROUND 的第二参数可以是单元格引用,这一点在做可配置模板时非常有用。把保留位数写在 F1 里,公式写成 =ROUND(C2,$F$1),改一个数字就能切换整个报表的精度,不必逐个修改公式。

与它同族的还有三个函数。=ROUNDUP(数字,小数位数) 永远向绝对值更大的方向进位,=ROUNDDOWN(数字,小数位数) 永远向绝对值更小的方向舍去,两者都不看第三位小数是几。=MROUND(数字,倍数) 把数字取整到最接近的指定倍数,例如 =MROUND(1237,50) 返回 1250。

函数 规则 对 3.14159 保留两位 对 -3.5 取整 典型用途
ROUND 四舍五入 3.14 -4 金额、平均值呈现
ROUNDUP 绝对值增大方向 3.15 -4 保守估算、向上兜底
ROUNDDOWN 绝对值减小方向 3.14 -3 保守估算、向下兜底
MROUND 取最近的倍数 3.15(倍数为 0.05) -4(倍数为 2) 包装单位、批量规格
INT 向下取整 3 -4 取整数部分
TRUNC 截断小数 3 -3 只去掉小数

负数是最容易出错的地方。=ROUND(-3.5,0) 返回 -4,因为四舍五入时 -3.5 远离零方向进位;=INT(-3.5) 也返回 -4,因为 INT 是向下取整,也就是往数轴左边靠;而 =TRUNC(-3.5) 返回 -3,因为它只是简单地把小数部分砍掉。这三个函数在正数上结果经常相同,在负数上几乎必然不同。

还有一条与直觉不符的规则:ROUND 对 5 的处理并非银行家舍入。Excel 的 ROUND 遇到恰好为 5 时一律进位,不做奇偶判断。所以 =ROUND(2.5,0) 返回 3,=ROUND(1.5,0) 返回 2。如果你期待的是统计学上的银行家舍入,Excel 没有对应的内置函数,需要自己判断奇偶。

把 ROUND 用在平均值上是另一个高频场景。=AVERAGE(C2:C200) 常常返回一长串小数,直接在报表里呈现既不专业也不好看,套一层 =ROUND(AVERAGE(C2:C200),1) 保留一位小数即可。取整位置的先后也有讲究:先平均后取整,与先取整后平均,结果可能不同,前者更准确。关于平均值的取舍,见 平均值陷阱:AVERAGE、AVERAGEIF 和中位数。

还有一类需求是保留整数但显示成以万为单位。写法是 =ROUND(A2/10000,1) 得到 12.3,然后在单元格格式里加上单位,或者用 TEXT 拼接。注意这只是改变了数值的量级,参与后续计算时要记得还原,否则会把 12.3 当成 12.3 元。统一在报表最外层做单位换算,是避免这类失误的好习惯。

二、INT 与 TRUNC:向下取整与截断

=INT(数字) 返回不大于该数字的最大整数,也就是数学上的向下取整。正数时它等于截断小数,负数时它会再减 1。例如 =INT(3.7) 返回 3,而 =INT(-3.7) 返回 -4。这个差异常常导致金额计算出现一块钱的偏差。

=TRUNC(数字,[小数位数]) 按指定位数截断,不做任何进位,第二参数默认为 0。它在正负数上的行为对称,=TRUNC(3.7) 返回 3,=TRUNC(-3.7) 返回 -3。如果你要的只是去掉小数部分而不关心方向,用 TRUNC 更符合直觉。

日常最常用 INT 的场景是算整箱数。例如每箱装 12 个,现有 100 个,装满的箱数写成 =INT(100/12) 返回 8;还差几个装满一箱写成 =12-MOD(100,12) 返回 4。这两个公式配合,就能把装箱问题一次算清。

INT 也常用来判断奇偶。写成 =IF(MOD(A2,2)=0,"偶数","奇数"),用 MOD 取余判断更直接;用 INT 的写法是 =IF(A2/2=INT(A2/2),"偶数","奇数"),明显更啰嗦。判断奇偶优先用 MOD,这是它的主场。

还有一个容易忽略的点:INT 与 TRUNC 对日期时间同样有效。日期时间本质上是带小数的数字,整数部分是日期,小数部分是时间。要只取日期不要时间,写成 =INT(A2) 然后把单元格格式设为日期即可,比用 TEXT 转换更省事,结果仍是真日期,可以继续参与计算。

三、MOD:取余与它的三个套路

MOD取余的三个套路

=MOD(被除数,除数) 返回两数相除的余数,结果的符号与除数相同。例如 =MOD(10,3) 返回 1,=MOD(10,4) 返回 2。除数为 0 时返回 #DIV/0!,这是它唯一的错误情况。

套路一是判断整除。写成 =IF(MOD(A2,3)=0,"能被3整除","不能"),或者更实用的版本:每满 3 件送 1 件,判断某数量是否刚好凑整。把判断结果作为条件格式的依据,能自动标出需要补单的行。

套路二是循环取值。要从一列数据中每隔 N 行取一个,或者做周期标记,写成 =MOD(ROW(A1),7) 会得到 0 到 6 的循环序列,配合 IF 就能标出每周固定某天。再比如给表格做斑马纹,条件格式里写 =MOD(ROW(),2)=0,隔行自动上色,不用手工设置。

套路三是跨周期计算。假设工号按部门循环分配,=MOD(A2-1,5)+1 可以得到 1 到 5 的循环编号,避免 MOD 在整除时返回 0 的尴尬。这个减 1 再加 1 的写法是标准技巧,凡是想要 1 到 N 循环而不是 0 到 N 减 1 循环时都用得上。

MOD 还能处理时间的循环。计算两个时间相差多少分钟,写成 =MOD(结束时间-开始时间,1)*1440,其中的 MOD 保证跨午夜时结果仍为正数。比如 23:50 到次日 0:10,直接相减得到负数,套上 MOD 后得到正确的 20 分钟。做排班表和工时统计时,这是必会的写法。

MOD 还有一个进阶用法:配合 SUMPRODUCT 做按条件分组求和。例如要把所有序号为奇数的行求和,写成 =SUMPRODUCT((MOD(ROW(A2:A200),2)=1)*C2:C200),第一部分生成 TRUE 与 FALSE 的数组,乘号把它转成 1 与 0,再与金额相乘求和。布尔值参与算术运算会自动转成 1 和 0,这是数组公式里最常用的技巧之一。

再举一个实用例子:判断某日期是星期几并做标记,写成 =MOD(WEEKDAY(A2),7) 可以得到 0 到 6 的循环值,配合 CHOOSE 就能输出中文星期名。这类组合看似复杂,拆开不过是把一个大问题分成取余与映射两步。培养这种拆分意识,比背下具体公式更有价值。

四、向上取整与按倍数取整

=CEILING(数字,倍数) 把数字向上取整到指定倍数,=FLOOR(数字,倍数) 向下取整到指定倍数。例如 =CEILING(1237,50) 返回 1250,=FLOOR(1237,50) 返回 1200。两者在采购、包装、计费场景里用得极多。

新版 Excel 提供了 =CEILING.MATH(数字,[倍数],[模式]) 与 =FLOOR.MATH,行为更可控,尤其是处理负数时可以指定进位方向。第三参数模式为 0 时负数向零方向舍入,非零时向远离零方向舍入。写模板给不同版本的人用时,优先用 CEILING,兼容性最好。

按倍数取整的典型场景是运费计算。快递按每 0.5 公斤计费,不足 0.5 公斤按 0.5 公斤算,写成 =CEILING(A2,0.5)*单价。如果还要设起步重量,写成 =CEILING(MAX(A2,1),0.5)*单价,先用 MAX 保底再取整,逻辑清晰。

还有按半小时计费的场景。停车时长 3 小时 10 分钟,按半小时向上取整,写成 =CEILING(A2,1/48),因为一天有 48 个半小时,时间在 Excel 里以天为单位。这种把时间单位换算成天的小数再取整的思路,适用于所有时长类计算。

CEILING 与 FLOOR 的第二参数也可以是小数,例如 =CEILING(A2,0.01) 等价于向上保留两位小数,与 =ROUNDUP(A2,2) 结果相同。选哪个取决于你的表达习惯:强调倍数关系时用 CEILING,强调小数位数时用 ROUNDUP。团队内部统一一种写法,能减少阅读成本。

需要提醒的是,MROUND 的第二参数必须与被取整的数同号,否则返回 #NUM!。处理可能为负的数据时,先写成 =MROUND(ABS(A2),倍数)*SIGN(A2),用绝对值取整再用 SIGN 还原符号。这个技巧同样适用于 CEILING 与 FLOOR 在负数上的兼容问题。

五、真实场景

先说一条总原则:取整应该发生在计算的最后一步。明细保留完整精度,只在汇总与呈现时做一次 ROUND,这样既保留了可追溯性,也避免了层层取整累积误差。这与求和时的思路一致,汇总类函数的用法见 SUM 家族:SUM、SUMIF、SUMIFS。

场景一:金额分账。要把 100 元按 3 比 7 分给两个人,直接乘会得到 30 与 70,恰好整除没问题;但如果总额是 100.05,两个人分得 30.015 与 70.035,保留两位后变成 30.02 与 70.04,加起来是 100.06,比总额多了一分。解决办法是让其中一人拿差额:第一人写 =ROUND(A2*0.3,2),第二人写 =A2-B2,永远保证合计相等。

场景二:工时核算。上下班打卡时间分别为 9:07 与 18:52,工时按半小时取整向下,写成 =FLOOR(B2-A2,1/48),再把结果乘 24 换算成小时数。如果遇到跨午夜的夜班,用前面讲过的 =MOD(B2-A2,1) 先处理,再套 FLOOR。

场景二的补充:工时计算里如果还要扣除午休,写成 =FLOOR(MOD(B2-A2,1)-TIME(1,0,0),1/48),先用 MOD 处理跨天,再减去一小时午休,最后按半小时向下取整。三步拆开写,比挤在一行里更好调试。遇到结果异常时,把中间结果单独放到一列查看,是定位问题最快的办法。

场景三:批量采购。某零件每包 25 个,需求 137 个,需要采购 =CEILING(137,25) 也就是 150 个,共 6 包,写成 =CEILING(137,25)/25。库存余量则是 =MOD(137,25) 的补数,也就是 =25-MOD(137,25) 等于 13 个才能凑满一包。

场景四:编号分组。1000 条记录每 50 条分一组,组号写成 =INT((ROW(A1)-1)/50)+1,从第 1 行开始得到 1,第 51 行得到 2。去掉减 1 加 1 的话,第 50 行就会提前跳到组 2,所以这一步不能省。

场景四的补充:分组编号也常配合余数使用。要在每组内标出这是本组的第几条,写成 =MOD(ROW(A1)-1,50)+1,与组号公式共用同一套逻辑。组号与组内序号都在手,做分页打印、分批导出就都很方便,不需要再手工切分。

场景五:保留有效数字。科学计数或报表规范要求保留两位有效数字时,写成 =ROUND(A2,2-INT(LOG10(ABS(A2)))-1),先用 LOG10 判断数量级,再决定保留几位小数。这个公式看起来复杂,但拆开来看就是先定位再取整,理解了就能复用。

六、取整需求速查

取整函数种类多,记住规则不如记住场景。下面这张表按常见需求给出对应写法,遇到问题时直接查表即可,不必再推导。

需求 写法 示例结果
保留两位小数 =ROUND(A2,2) 3.14159 变成 3.14
无条件进位 =ROUNDUP(A2,2) 3.14159 变成 3.15
无条件舍去 =ROUNDDOWN(A2,2) 3.14159 变成 3.14
取整到百位 =ROUND(A2,-2) 1234 变成 1200
取整数部分 =TRUNC(A2) -3.7 变成 -3
向下取整 =INT(A2) -3.7 变成 -4
取整到 50 的倍数 =MROUND(A2,50) 1237 变成 1250
向上取整到 50 的倍数 =CEILING(A2,50) 1237 变成 1250
判断能否整除 =MOD(A2,50)=0 返回 TRUE 或 FALSE

取整之后一定要回头核对合计。用 =ROUND(SUM(A2:A100),2) 与 =SUM(ROUND(A2:A100,2)) 对比,两者不一致就说明存在尾差。金额类报表建议在第一列旁边插一列核对列,把差额显式地展示出来,而不是让它悄悄藏在小数里。

取整也常与条件判断配合使用。例如只有超过某个阈值才进位,写成 =IF(A2>=100,ROUND(A2,0),A2),条件判断的更多写法见 IF 家族:IF、IFS 与多层嵌套。

常见问题

想找出合计与明细的尾差,有什么快办法

在合计单元格旁边写 =ROUND(SUM(A2:A100),2)-SUM(ROUND(A2:A100,2)),结果不为 0 就说明存在尾差。多数情况下差额只有几分钱,但财务对账时这几分钱足以让人加班。找到差额后,把最后一行的明细改成总额减去其余各行,就能彻底消除。查找最大偏差行可以用 =MATCH(MAX(ABS(...)),...) 一类组合,先用辅助列算出每行的尾差再定位。

为什么 ROUND 之后合计对不上

这是四舍五入的固有代价。每个数单独取整后再相加,与先相加再取整,结果通常差几分钱。解决办法是只在一处取整:明细保留完整小数,只在最终合计单元格做一次 ROUND。如果业务要求明细必须是两位小数,那就让最后一行的金额等于总额减去前面所有行,也就是 =ROUND(总额-SUM(前面各行),2),用差额兜住尾数。财务对账尤其要注意这一点。

INT 和 TRUNC 到底该用哪个

取决于你对负数的期望。如果数据全是正数,两者完全一样,随便用。如果可能出现负数,并且你希望 -3.7 变成 -3,用 TRUNC;希望变成 -4,用 INT。金额、数量这类业务数据通常不会出现负值,用哪个都行,但为了可读性建议统一用 TRUNC,因为它的行为不随符号变化,不容易让接手的人困惑。

为什么浮点运算会让取整结果看起来不对

计算机用二进制存储小数,很多十进制小数无法精确表示。比如 0.1 加 0.2 在 Excel 里并不严格等于 0.3,而可能等于 0.30000000000000004。这时 =ROUND(0.1+0.2,1) 仍然正确,但 =MOD(0.3,0.1) 可能返回 0.09999999999999998 而不是 0。判断相等时不要写 =A2=B2,改成 =ROUND(A2-B2,6)=0 留一点容差,这是处理浮点问题的通用做法。

MOD 的结果是负数怎么办

当被除数为负时,Excel 的 MOD 结果符号与除数一致,所以 =MOD(-10,3) 返回 2 而不是 -1。这符合数学定义,但可能不符合你的预期。如果需要始终返回非负余数,写成 =MOD(MOD(A2,B2)+B2,B2),套两层 MOD 强制归正。处理时间差、周期编号这类场景时,这个写法能避免一半的调试时间。

CEILING 在 WPS 里能用吗

可以。CEILING 与 FLOOR 在 WPS 表格里完全支持,参数一致。CEILING.MATH 与 FLOOR.MATH 需要较新的版本,遇到 #NAME? 时退回 CEILING。另外要注意,CEILING 的第二参数不能为 0,否则返回 #DIV/0!;数字与倍数符号相反时也会报错,例如 =CEILING(-5,2) 在部分版本里会出错,处理负数前先取绝对值再补回符号更稳妥。

取整函数能配合最值函数一起用吗

可以,而且很常用。例如要把最高销售额向上取整到千位展示,写成 =CEILING(MAX(C2:C200),1000);要取库存缺口的最大整箱数,写成 =INT(MAX(F2:F200)/25)。组合的原则是内层先算出精确值,外层再做取整,顺序反了结果会不一样。最值函数的用法见 极值与排名:MAX、MIN、LARGE、SMALL、RANK。

怎么判断一个数是不是整数

用 =MOD(A2,1)=0,或者 =INT(A2)=A2。前者更直接,后者在负数上要注意 INT 的方向性。判断结果可以直接用在 IF 里做提示,例如 =IF(MOD(A2,1)=0,"","不是整数,请检查")。批量检查录入数据时,把这一列放在最右侧,配合筛选就能快速定位问题行。

保留小数位数时,改单元格格式可以吗

可以,但要知道它只是改变了显示,底层数值并没有变。把 3.14159 的格式设为两位小数,看起来是 3.14,参与计算时仍然是 3.14159。如果后续有求和或比较,显示的数与实际的数可能不一致,导致合计差几分钱。凡是要参与后续计算的,一律用 ROUND 真正改变数值;只是给人看的,改格式即可。这也是排查金额差异时的第一检查点。

取余在分组场景里还有别的用法吗

很多。比如把名单按 N 人一轮循环分配任务,写成 =MOD(ROW(A1)-1,N)+1;给每个月的同一天做标记,写成 =MOD(DAY(A2),7);判断某年是否为闰年,写成 =IF(MOD(YEAR(A2),4)=0,"可能是闰年","不是"),完整的闰年判断还要考虑百年与四百年,但这已经能覆盖绝大多数场景。凡是遇到周期性、轮流、循环的需求,先想想 MOD 能不能解决,通常答案是能。