判断偶数最直接方式是n % 2 == 0,适用于所有整数类型(含负数、int.MinValue),无需额外函数或转换;decimal等非整数类型不支持%需转整型或用Math.IEEERemainder。
用 % 判断偶数是最直接的方式
整数对 2 取余结果为 0,就是偶数。c# 中直接写 n % 2 == 0 即可,不需要额外函数或转换。
注意:负数也适用——-4 % 2 是 0,-3 % 2 是 -1,所以 -4 % 2 == 0 仍返回 true。
-
%是取余(remainder),不是取模(modulo),但在操作数同号时行为一致;C# 的%对负数定义明确,可放心用于偶数判断 - 不要用
n / 2 * 2 == n这类算术绕行方式,整数除法虽安全,但多一次乘法+比较,无必要 - 浮点数不能直接用
%,如果变量是double或float,先确认是否真需要判断“偶数值”——多数场景应转为整数再判,否则涉及精度陷阱
int 以外类型要小心类型兼容性
只有整数类型支持 % 运算符。如果你拿到的是 long、short、byte,没问题;但 uint、ulong 也可以,只是和 int 混用时可能触发隐式转换警告。
-
long n = 10000000000L; bool even = n % 2 == 0;✅ 合法且高效 -
uint u = 5U; u % 2 == 0✅ 可用,但若和有符号数比较(如u % 2 == someInt),编译器可能提示“比较有符号/无符号”,建议统一类型 -
decimal d = 4.0m; d % 2❌ 编译错误——decimal不支持%,得用Math.IEEERemainder(d, 2) == 0或转(long)d(前提是确定无小数部分)
性能几乎没差别,但别在循环里重复计算
单次 % 2 是 CPU 级别的位运算优化,现代 JIT 甚至会把它编译成 test eax, 1 这类指令,快到可以忽略成本。
- 真正影响性能的是逻辑冗余:比如在 for 循环里反复写
if (i % 2 == 0) { ... },而i本身是递增整数——这时不如直接用步长为 2 的循环,或提前算好起始偏移 - 别为了“看起来更函数式”封装成
IsEven(int n) => n % 2 == 0再到处调用——除非你真需要抽象或测试替換,否则内联更清晰 - 如果判断逻辑嵌套很深(比如 LINQ 链式调用中多次用到),确保不是因为变量作用域混乱导致重复求值
容易被忽略的边界:int.MinValue 和溢出场景
int.MinValue % 2 == 0 是 true,因为 -2147483648 是偶数,而且 C# 的 % 在此不会溢出——它不依赖除法实现,而是基于位模式处理。
- 唯一真要警惕的是你自己写的“非标准偶数判断”,比如
(n & 1) == 0:这个位运算更快,但仅对补码整数安全;它对int、long有效,但对short或byte要先转成 int 再与,否则(b & 1)中b会被提升为int,结果没错但容易误读 - 如果数来自外部(如 JSON 解析、数据库读取),注意类型是否真为整数——比如字符串
"2.0"解析成double后直接%会编译失败 - 别假设
Math.Abs(n) % 2 == 0更安全——Math.Abs(int.MinValue)会抛OverflowException,纯属画蛇添足










