国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

PHP浮點數用法與問題總結

2024-05-04 21:57:24
字體:
來源:轉載
供稿:網友

在php浮點數處理函數在php中有很多,包括有如ceil,floor,round,intval 經過他們處理之后可返回我們想要的浮點數小數位了,下面我來介紹一些關于php浮點數用法與問題分析。

一,php浮點數用法

PHP浮點類型取整之ceil — 進一法取整

說明:float ceil (float value)

返回不小于 value 的下一個整數,value 如果有小數部分則進一位。ceil() 返回的類型仍然是 float,因為 float 值的范圍通常比 integer 要大。

例子1. ceil() 例子,實例代碼如下:

  1. <?php 
  2. echo ceil(4.3); // 5 
  3. echo ceil(9.999); // 10 
  4. ?> 

PHP浮點類型取整之floor — 舍去法取整

說明:float floor (float value)

返回不大于 value 的下一個整數,將 value 的小數部分舍去取整。floor() 返回的類型仍然是 float,因為 float 值的范圍通常比 integer 要大。

例子1. floor() 例子,代碼如下:

  1. <?php 
  2. echo floor(4.3); // 4 
  3. echo floor(9.999); // 9 
  4. ?> 

PHP浮點類型取整之round — 對浮點數進行四舍五入

說明:float round ( float val [, int precision] )

返回將 val 根據指定精度 precision(十進制小數點后數字的數目)進行四舍五入的結果。precision 也可以是負數或零(默認值)。

例子1. round() 例子,代碼如下:

  1. <?php 
  2. echo round(3.4); // 3 
  3. echo round(3.5); // 4 
  4. echo round(3.6); // 4 
  5. echo round(3.6, 0); // 4 
  6. echo round(1.95583, 2); // 1.96 
  7. echo round(1241757, -3); // 1242000 
  8. echo round(5.045, 2); // 5.05 
  9. echo round(5.055, 2); // 5.06 
  10. ?> 

PHP浮點類型取整之intval—對變數轉成整數型態

例子intval(),代碼如下:

  1. <?php 
  2. echo intval(4.3); //4 
  3. echo intval(4.6); // 4 
  4. ?> 

二,浮點數轉成字符串

PHP內置的echo, var_dump, json_encode,字符串拼接等函數(指令)在顯示浮點數時都有問題,導致精度丟失.實例代碼如下:

  1. <?php 
  2.    $a = 1315537636.338467; 
  3.    printf("%f"$a); echo "n"
  4.    echo $a . "n"
  5.    echo $aecho "n"
  6.   ?> 
  7. /* 
  8. 結果 
  9.   1315537636.338467 
  10.   1315537636.3385 
  11.   1315537636.3385 
  12. */ 

也就是說,用PHP最順手的方法將浮點數轉成字符串或者顯示是不行的,必須使用printf/sprintf將浮點數轉成字符串.

三,一個常見問題的解答

不過,我當時遺漏了一點,也就是對于如下的這個常見問題的回答,實例代碼如下:

  1. <?php 
  2.     $f = 0.58;  
  3.     var_dump(intval($f * 100));   
  4. ?> 

為啥輸出57

為啥輸出是57啊? PHP的bug么?我相信有很多的同學有過這樣的疑問,因為光問我類似問題的人就很多,更不用說bugs.php.net上經常有人問…

要搞明白這個原因,首先我們要知道浮點數的表示(IEEE 754):

浮點數,以64位的長度(雙精度)為例,會采用1位符號位(E),11指數位(Q),52位尾數(M)表示(一共64位).

符號位:最高位表示數據的正負,0表示正數,1表示負數。

指數位:表示數據以2為底的冪,指數采用偏移碼表示

尾數:表示數據小數點后的有效數字.

這里的關鍵點就在于,小數在二進制的表示,關于小數如何用二進制表示,大家可以百度一下,我這里就不再贅述,我們關鍵的要了解, 0.58 對于二進制表示來說,是無限長的值(下面的數字省掉了隱含的1)..

0.58的二進制表示基本上(52位)是:  

0010100011110101110000101000111101011100001010001111 

0.57的二進制表示基本上(52位)是:  

0010001111010111000010100011110101110000101000111101

而兩者的二進制, 如果只是通過這52位計算的話,分別是: 

0.58 -> 0.57999999999999996 

0.57 -> 0.56999999999999995

至于0.58 * 100的具體浮點數乘法, 我們不考慮那么細, 有興趣的可以看(Floating point), 我們就模糊的以心算來看… 0.58 * 100 = 57.999999999

那你intval一下, 自然就是57了….

可見,這個問題的關鍵點就是:“你看似有窮的小數,在計算機的二進制表示里卻是無窮的”

四,float(浮點數)比較的問題

最近在開發一個合同管理系統的時候,涉及到兩個浮點數比較,算是把我郁悶慘了。

在N久以前,就不曉得從哪里聽來的一個“不要用等號去比較浮點數”的“真理”,自己平時也在用,好像沒有出現啥問題,可這次問題總算是來了,實例代碼如下:

  1. <?php  
  2. $sum = "12300.00";  
  3. $a   = "10000.30";  
  4. $b   =  "2000.30";  
  5. $c   =   "299.40";  
  6. $sum = (float) $sum;  
  7. $s = (float) ($a+$b+$c);  
  8. var_dump($sum$s);  
  9. var_dump($sum==$s); 
  10. /* 
  11. 結果是: 
  12. float(12300)  
  13. float(12300)  
  14. bool(false) 
  15. */ 

后來才知道在PHP中,要比較兩個浮點數的大小,可以用bccomp(參數1,參數2,小數位)來比較,實例代碼如下:

  1. <?php  
  2. $sum = "12300.00";  
  3. $a   = "10000.30";  
  4. $b   =  "2000.30";  
  5. $c   =   "299.40";  
  6. $sum = (float) $sum;  
  7. $s = (float) ($a+$b+$c);  
  8. var_dump($sum$s);  
  9. var_dump(bccomp($sum,$s,2)); 
  10. /* 
  11. 結果: 
  12. float(12300)  
  13. float(12300)  
  14. int(0) // 0表示兩個浮點數值相等 
  15. */ 

bccomp函數具體用法參與PHP手冊.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 滦南县| 新巴尔虎右旗| 姜堰市| 收藏| 区。| 吴忠市| 富裕县| 郸城县| 独山县| 安新县| 遂昌县| 丽水市| 班玛县| 莒南县| 丰宁| 巴彦淖尔市| 灵宝市| 连山| 合作市| 怀柔区| 北辰区| 莎车县| 新蔡县| 织金县| 蕲春县| 溧水县| 红河县| 南充市| 石狮市| 永寿县| 枣阳市| 邳州市| 青川县| 无为县| 扶风县| 南投市| 沂南县| 海兴县| 宁蒗| 雷山县| 二连浩特市|