群里有人问:判断奇数偶数是不是只用%2就行了?基本上是的。但实际写代码时,有几个细节值得注意,尤其是表单传值和数据类型。
判断规则
-
偶数:能被2整除的数。如2、4、6、8、10等,余数为0。
-
奇数:不能被2整除的数。如1、3、5、7、9等,余数为1。
核心就是除法取余。
基础写法:固定数值判断
<?php
$number = 1233456;
if ($number % 2 == 0) {
echo "$number 是偶数";
} else {
echo "$number 是奇数";
}
?>
输出:1233456 是偶数
这个写法够用。但$number % 2返回的结果,在PHP里对负数也有效。负数取余的结果可能是负数,但判断时==0不受影响。
表单写法:接收用户输入
项目开发中数字经常来自用户提交,下面这个例子演示了表单处理流程。
<html>
<body>
<form method="post">
输入一个数字:
<input type="number" name="number">
<input type="submit" value="提交">
</form>
</body>
</html>
<?php
if ($_POST) {
$number = $_POST['number'];
if (($number % 2) == 0) {
echo "$number 是偶数";
} else {
echo "$number 是奇数";
}
}
?>
输入23456 → 输出23456 是偶数
输入285965 → 输出285965 是奇数
个人经验:一个容易踩的坑
代码号学习编程时,很多初学者忽略了一个问题:<input type="number">在HTML5里返回的是字符串类型,但PHP的取模运算会自动把字符串转成数字。大部分情况下没问题。
但要注意:如果用户不输入任何内容直接提交,$_POST['number']可能是空字符串。空字符串在取模运算中会被当作0,程序会输出“0是偶数”。从逻辑上讲0确实是偶数,但这可能不是用户想要的结果。
个人建议:加一个非空判断。
if ($_POST && isset($_POST['number']) && $_POST['number'] !== '') {
$number = $_POST['number'];
// 后续判断逻辑
} else {
echo "请输入有效的数字";
}
为什么用取模运算符而不是其他方法?
有些开发者可能会问:用$number / 2然后判断是不是整数行不行?
比如is_int($number / 2)。这个写法在PHP里有问题,因为$number / 2的结果可能是浮点数(比如7/2=3.5),用is_int()判断3.5会返回false,逻辑上是对的,但多了一次类型转换。取模运算%就是为这种场景设计的,更直接、性能开销更小。
本节课程知识要点
-
%取模运算符是判断奇偶数的常用工具 -
偶数判断条件:
$number % 2 == 0 -
表单传值时建议加上非空校验和
isset()判断 -
type="number"输入框仍需要后端校验,前端验证可绕过
换几个例子跑一遍
示例1:数字0
0 % 2 = 0,输出偶数。数学上0是偶数,这个结果正确。
示例2:负数
-7 % 2 = -1(PHP的取余结果符号与被除数相同),不等于0,输出奇数。这也是正确的。
示例3:大整数
PHP整数类型在64位环境下可以处理到9e18左右。超过这个范围会变成浮点数,浮点数取模会有精度问题。如果需要处理超大整数,可以考虑用fmod()函数或BCMath扩展。
扩展:位运算判断法
除了取模,还可以用位运算。偶数的二进制之后一位是0,奇数之后一位是1。
if (($number & 1) == 0) {
echo "偶数";
} else {
echo "奇数";
}
&是按位与运算符。$number & 1只保留之后一位二进制。这个方法比取模稍微快一点,但可读性差一些。日常开发用取模就够了,对性能要求很高的场景才考虑位运算。