本篇文章主要讲述,PHP中的模数运算符,接下来由SKY8G进行编辑和讲解。
大家都知道,PHP总共有八个算术运算符。最常见的是加法addition(+),减法subtraction (-),乘法multiplication(*)和除法division (/)。少为人知,但还有一个非常重要的运算符是取模modulo(%)。在本教程中,我们将重点关注取模运算符。我们将讨论它的作用以及它在实际用途。
在数学中,模运算用于找到两个数之间的余数。给定两个正数,即被除数(x)和除数(y),模数是除以y(x / y)的欧几里德除法的余数。例如,表达“7模数3”将评估为1,因为7除以3得到2的商和1的余数。另一个例子,“9模数3”将评估为0,因为9除以3的商为3,余数为0 。我们一直在做这是我们小学四年级的时候,当我们第一次学习长期分裂和剩余时。
模运算符是做什么的?
如果你有两个变量$a
和$b
,计算$a % $b
-通常发音为“a与b取模” 取模是一个整数运算符,因此它在计算余数之前将两个操作数转换为整数。因此,基本上模数会进行整数除法,然后将从被除数中除不尽的余数返回,则这个余数就是取模的结果。
1.取模的作用可以用来取余数。
2.取模的作用可以判断两个整数是否整除
3.取模的作用一个整数与整数2取模可以判断这个整数是偶数还是奇数
4.还用更加复杂的取模运算,进行逻辑判断等等,这里就不一一列举了。
取模运算的工作原理:
a.取模运算符的操作数在运算之前都会转换成整数(除去小数部分)。
b.取模运算符 % 的结果和被除数的符号(正负号)相同。即 $a % $b 的结果和 $a 的符号相同。
它乍一看并不是很有用。但是,它在某些情况下非常有用。下面我举几个例子大家可以看看:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?php echo 89 % 37 ,"\n"; // Output: 15 echo 89 % -37,"\n"; // Output: 15 echo -89 % 37,"\n"; // Output: -15 echo -89 % -37,"\n"; // Output: -15 echo -55.4 % -4.2,"\n"; // Output: -3 echo -55.9 % -4.8,"\n"; // Output: -3 echo -55 % -4,"\n"; // Output: -3 |
输出
1 2 3 4 5 6 7 | 15 15 -15 -15 -3 -3 -3 |
例子2,判断一个数字为偶数还是奇数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?php $numbers = array(66 , 57 , 89 , 33 , 22 ) ; foreach($numbers as $num) { $m = ($num % 2); if ($m==0) { echo $num , " is even " , "<br>"; }else { echo $num , " is odd " , "<br>"; } } // Further simplified code foreach($numbers as $num) { if($num % 2) { echo "$num is odd<br />"; } else { echo "$num is even<br />"; } } |
例子3,挑战数学,例如:打印出20到250之间9的所有因子
1 2 3 4 5 6 7 8 9 10 11 12 | <?php $i = 25; while ( $i <= 250 ) { $m = ($i % 9); if ($m==0) { echo $i." "; } $i++; } |
例子4,为HTML表中的交替行改变(背景颜色)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <html> <head> <title>zebra table</title> <style type="text/css"> #mytable tbody tr.even td{ background-color: #d3ecf5; } #mytable tbody tr.odd td{ background-color: #ff0; } </style> <body> <table id='mytable'> <tbody> <?php $myData = array( 'one' ,'two' , 'three' , 'four' , 'five') ; $row = 0 ; foreach($myData as $data): ?> <tr class="<?php echo fmod($row , 2) ? 'even' : 'odd' ?>"> <td> <?php echo $data; $row++?> </td> </tr> <?php endforeach; ?> </tbody> </table> </body> </html> |
例子4,判断年份是否为闰年和平年
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <html> <head> <title>zebra table</title> <style type="text/css"> #mytable tbody tr.even td{ background-color: #d3ecf5; } #mytable tbody tr.odd td{ background-color: #ff0; } </style> <body> <table id='mytable'> <tbody> <?php $myData = array( 'one' ,'two' , 'three' , 'four' , 'five') ; $row = 0 ; foreach($myData as $data): ?> <tr class="<?php echo fmod($row , 2) ? 'even' : 'odd' ?>"> <td> <?php echo $data; $row++?> </td> </tr> <?php endforeach; ?> </tbody> </table> </body> </html> |
例子5,另一个用途是信用卡验证。有没有想过网站如何判断您的信用卡是否有效?他们使用mod 10算法,这是大多数信用卡符合的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | <?php //http://www.codeguru.com/cpp/i-n/internet/security/article.php/c15307/PHP-Tip-Validating-a-Credit-Card.htm function validate_cc_number($cc_number) { /* Validate; return value is card type if valid. */ $false = false; $card_type = ""; $card_regexes = array( "/^4\d{12}(\d\d\d){0,1}$/" => "visa", "/^5[12345]\d{14}$/" => "mastercard", "/^3[47]\d{13}$/" => "amex", "/^6011\d{12}$/" => "discover", "/^30[012345]\d{11}$/" => "diners", "/^3[68]\d{12}$/" => "diners", ); foreach ($card_regexes as $regex => $type) { if (preg_match($regex, $cc_number)) { $card_type = $type; break; } } if (!$card_type) { return $false; } /* mod 10 checksum algorithm */ $revcode = strrev($cc_number); $checksum = 0; for ($i = 0; $i < strlen($revcode); $i++) { $current_num = intval($revcode[$i]); if($i & 1) { /* Odd position */ $current_num *= 2; } /* Split digits and add. */ $checksum += $current_num % 10; if ($current_num > 9) { $checksum += 1; } } if ($checksum % 10 == 0) { return $card_type ; } else { return $false; } } |
例子6,计算时间秒数换算成时分秒。
1 2 3 4 5 6 7 8 9 10 11 | <?php $total_seconds = 32987; $hours = (int)($total_seconds / 3600); $minutes = (int)(($total_seconds - 3600 * $hours )/60); $seconds = $total_seconds % 60; echo 'Hours:'.$hours.' Minutes:'.$minutes.' Seconds:'.$seconds.''; ?> |
浮点模数
如果要在两个浮点数取模计算余数,则必须使用该fmod($dividend, $divisor)
函数。它返回除法后的浮点余数。余数值与被除数的符号相同,其大小将小于除数。这三个数字的关系如下:
1 | $dividend = i*$divisor + $remainder |
这里,值i
总是一个整数。
例如:
1 2 3 4 5 6 | <?php $x = 5.7; $y = 1.3; $r = fmod($x, $y); // $r equals 0.5, because 4 * 1.3 + 0.5 = 5.7 ?> |
您应该记住,由于分数的二进制或十进制表示的限制,浮点运算并不总是准确的。例如,1/3不能以十进制形式准确表示。你可以继续写0.33333 ….但在某些时候你必须停止。在十进制表示中每增加3个,您将更接近原始值,但该值仍然不是正好1/3。
这种不准确性导致fmod()
功能问题 :结果并不完全可靠。
以下是该fmod()
功能的一些示例:
1 2 3 4 5 6 7 8 9 | <?php echo fmod(18.8, 2); // Output: 0.8 echo fmod(18.8, 0.2); // Output: 0.2 ?> |
第二个值不准确,因为0.2完全分为18.8。这只是计算机使用的浮点格式计算的一个缺点。
好了,通过本篇文章相信你对PHP的取模有所了解了吧。模运算符虽然易于使用,但它有很多应用程序。我们通过查看正数和负数以及浮点数的模数开始本教程。之后,我们介绍了一些我们将使用模数的常见场景。
看到php就头疼