本文目录一览:
php 的位运算总结
php的位运算很少会用到,但是用处很大, 在有些算法中会用到,在权限管理中也会经常用到, 对于理解计算机的世界也会有一定的帮助,所以得把这些重要但不常用的东西总结一下记录一下。 提到位运算,避不开的是二进制。 因为位运算是直接在内存做操作和运算,相较与直接拿两个变量做运算符肯定是更快的。 很多地方把二进制这玩意说得很晦涩,现在来以最简单的方式来总结一下,当然只算 int 范围内的数算了,超过了这个范畴程序员还不如拿这时间去学点别的。 说完以上总结,再来解释下什么是二进制,网上大把, 但只要记住,int范围内的数也就是我们大部分需要用到的数,都可以用二进制来表示。 我们生活中用到的计数方式为十进制,由个数位满10进1, 然后再开始重新计算,等十位满9再加一时,百位加一,十位归零。 二进制则只有两个数字来表示就是0和1,满2进1。 由32个位组成,虽然只有32个位但已满足了我们正常的需求了 比如说1转换为2进制原码,由于1是正数所以符号位为0, 原码反码补码都一个样。 1的原码:00000000 00000000 00000000 00000001 因手懒,太多0太丑用+拼接,'0* 8'代表8个0 2的原码:0* 8 0* 8 0* 8 0* 6 + 1 0,既然是二进制, 满2就得进1,最低位归0,向前加一。 再来解释下负数的原码反码和补码,就开始讲php的位运算了。 二进制复习完毕。下面开始讲讲php的位运算。 php一共有六种位运算,一种一种来讲。 可以这么理解,两个数的补码放在一起比较每个位(一共32个位), 可以得出另外一个数,这个数字的组成由比较的两位数字生成, 如果两个数的每个位数上的数字都等于1的话, 那得到的那个数的补码的同位为1,否则为0。 听着绕口,其实很简单,觉得还是比官网上的更容易让新手看懂 下面举例子: 首先来求-1和7的补码。7的原码就是补码。 两个补码都有了下面开始运算: 按照上面的说法, 每个位都有一样则 $a 的同等位则为1,刚好-1的补码和7的补码前面都不一样,就最后三位一样,所以刚好求得的 $a 的补码的最后三位是1而其他的都是0 ,刚好这个补码为正数,正好就是7。 其实就是和按位与相反,只要有1个为1,那就为1,如果都不为1,那就为0。 $a = -1|7 ;得出来的 $a 补码为32个1,但此时不能说 $a 就是-1,因为这只是补码,要转成原码再转成十进制数,补码-1,然后再翻转,再转出来,得到的其实也还是-1。 就是将这个数的补码全部翻转过来,包括符号位,0变1,1变0 取反的结果一定是整数变负数负数变正数,取正数的反时, 记得一定要从补码一步步转到原码再转成十进制数才是答案。 两个数的补码比较,同等位上的两数比较 不一样时,则答案的补码的同位则为1,否则为0。 往左移符号位被挤走右边0补充,往右移动,符号位不动, 高位以符号位补充。二进制世界里往左移动其实是相当于乘以了2, 右移相当于除以了2。 不吹牛逼的说,这应该是互联网上最容易理解的php位运算的解释和二进制的解释了。 原文链接: php的位运算总结-PHP
php 科学计算法 科学记数法 E 保留 小数位数
舍去
echo floor(4.3); // 4
进一
echo ceil(4.3); // 5
四舍五入
echo round(3.4); // 3
echo round(3.5); // 4
php如何保留一位小数,包括0,内详?
PHP变量保留一位小数,包括0;可以考虑使用sprintf
函数,控制浮点数格式。示例如下:
<?php
header("Content-type:text/html;charset=utf-8;");
$money = 20;
$money = sprintf("%.1f", $money);
echo $money;
// 20.0
$money2 = 20.20;
$money2 = sprintf("%.1f", $money2);
echo $money2;
// 20.2
PHP初学者,四舍五入并且保留1位小数的函数
用round
函数。
其中包含2个参数,第一个参数是要转化的变量,第二参数是要保留的小数位数!
望采纳,谢谢!
为什么php用小数点相减不对呢
一则浮点数计算例子如下:
$a = 0.2 + 0.7;
$b = 0.9;
var_dump($a == $b);
打印出的结果是:bool(false)
。也就是说在这里 0.2+0.7
的计算结果与 0.9
并不相等,这显然是有违我们的常识的。
对此问题,PHP官方手册曾有说明:显然简单的十进制分数如 0.2
不能在不丢失一点点精度的情况下转换为内部二进制的格式。这和一个事实有关,那就是不可能精确的用有限位数表达某些十进制分数。例如,十进制的 1/3
变成了 0.3333333...
。
我们将上面的变量用双精度格式打印出来:
$a = 0.2 + 0.7;
$b = 0.9;
printf("%0.20f", $a);
echo '<br />';
printf("%0.20f", $b);
输出结果如下:
0.89999999999999991118
0.90000000000000002220
显然在这里,实际上作为浮点型数据,其精度已经损失了一部分,达不到完全精确。所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。需要说明的是,这不是PHP的问题,而是计算机内部处理浮点数的问题!在 C、JAVA 等语言中也会遇到同样的问题。
所以要比较两个浮点数,需要将其控制在我们需要的精度范围内再行比较,因此使用 bcadd()
函数来对浮点数相加并进行精度转换(为字符串):
var_dump(bcadd(0.2, 0.7, 1) == 0.9); // 输出:bool(true)
浮点数取整
在《PHP 取整函数 ceil 与 floor》一文中,曾有例子:
echo ceil(2.1 / 0.7); // 输出:4
经过上面对浮点数计算的探讨,知道这是浮点数计算结果不完全精确造成的:
printf("%0.20f", (2.1 / 0.7)); // 输出:3.00000000000000044409
因此使用 round()
函数处理一下即可:
echo ceil(round((2.1 / 0.7), 1));
虽然 round()
函数是按照指定的精度进行四舍五入,但保留小数点后一位,对我们的取整结果是没影响的。