本文目錄一覽:
- 1、php 的位運算總結
- 2、php 科學計演算法 科學記數法 E 保留 小數位數
- 3、php如何保留一位小數,包括0,內詳?
- 4、PHP初學者,四捨五入並且保留1位小數的函數
- 5、為什麼php用小數點相減不對呢
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》一文中,曾有例子:
代碼如下:
?php
echo ceil(2.1/0.7); // 輸出:4
?
經過上面對浮點數計算的探討,知道這是浮點數計算結果不完全精確造成的:
代碼如下:
?php
printf(“%0.20f”, (2.1/0.7)); // 輸出:3.00000000000000044409
?
經過上面對浮點數計算的探討,知道這是浮點數計算結果不完全精確造成的,因此使用 round() 函數處理一下即可:
代碼如下:
?php
echo ceil( round((2.1/0.7),1) );
?
雖然 round() 函數是按照指定的精度進行四捨五入,但保留小數點後一位,對我們的取整結果是沒影響的。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/193599.html