日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁(yè) > php開(kāi)源 > php教程 > PHP浮點(diǎn)數(shù)用法與問(wèn)題總結(jié)

PHP浮點(diǎn)數(shù)用法與問(wèn)題總結(jié)

來(lái)源:程序員人生   發(fā)布時(shí)間:2014-04-18 09:30:57 閱讀次數(shù):2702次

在php浮點(diǎn)數(shù)處理函數(shù)在php中有很多,包括有如ceil,floor,round,intval 經(jīng)過(guò)他們處理之后可返回我們想要的浮點(diǎn)數(shù)小數(shù)位了,下面我來(lái)介紹一些關(guān)于php浮點(diǎn)數(shù)用法與問(wèn)題分析。

一,php浮點(diǎn)數(shù)用法

PHP浮點(diǎn)類(lèi)型取整之ceil — 進(jìn)一法取整

說(shuō)明:float ceil (float value)

返回不小于 value 的下一個(gè)整數(shù),value 如果有小數(shù)部分則進(jìn)一位。ceil() 返回的類(lèi)型仍然是 float,因?yàn)?float 值的范圍通常比 integer 要大。

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

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

PHP浮點(diǎn)類(lèi)型取整之floor — 舍去法取整

說(shuō)明:float floor (float value)

返回不大于 value 的下一個(gè)整數(shù),將 value 的小數(shù)部分舍去取整。floor() 返回的類(lèi)型仍然是 float,因?yàn)?float 值的范圍通常比 integer 要大。

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

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

PHP浮點(diǎn)類(lèi)型取整之round — 對(duì)浮點(diǎn)數(shù)進(jìn)行四舍五入

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

返回將 val 根據(jù)指定精度 precision(十進(jìn)制小數(shù)點(diǎn)后數(shù)字的數(shù)目)進(jìn)行四舍五入的結(jié)果。precision 也可以是負(fù)數(shù)或零(默認(rèn)值)。

例子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浮點(diǎn)類(lèi)型取整之intval—對(duì)變數(shù)轉(zhuǎn)成整數(shù)型態(tài)

例子intval(),代碼如下:

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

二,浮點(diǎn)數(shù)轉(zhuǎn)成字符串

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

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

也就是說(shuō),用PHP最順手的方法將浮點(diǎn)數(shù)轉(zhuǎn)成字符串或者顯示是不行的,必須使用printf/sprintf將浮點(diǎn)數(shù)轉(zhuǎn)成字符串.

三,一個(gè)常見(jiàn)問(wèn)題的解答

不過(guò),我當(dāng)時(shí)遺漏了一點(diǎn),也就是對(duì)于如下的這個(gè)常見(jiàn)問(wèn)題的回答,實(shí)例代碼如下:

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

為啥輸出57

為啥輸出是57啊? PHP的bug么?我相信有很多的同學(xué)有過(guò)這樣的疑問(wèn),因?yàn)楣鈫?wèn)我類(lèi)似問(wèn)題的人就很多,更不用說(shuō)bugs.php.net上經(jīng)常有人問(wèn)…

要搞明白這個(gè)原因,首先我們要知道浮點(diǎn)數(shù)的表示(IEEE 754):

浮點(diǎn)數(shù),以64位的長(zhǎng)度(雙精度)為例,會(huì)采用1位符號(hào)位(E),11指數(shù)位(Q),52位尾數(shù)(M)表示(一共64位).

符號(hào)位:最高位表示數(shù)據(jù)的正負(fù),0表示正數(shù),1表示負(fù)數(shù)。

指數(shù)位:表示數(shù)據(jù)以2為底的冪,指數(shù)采用偏移碼表示

尾數(shù):表示數(shù)據(jù)小數(shù)點(diǎn)后的有效數(shù)字.

這里的關(guān)鍵點(diǎn)就在于,小數(shù)在二進(jìn)制的表示,關(guān)于小數(shù)如何用二進(jìn)制表示,大家可以百度一下,我這里就不再贅述,我們關(guān)鍵的要了解, 0.58 對(duì)于二進(jìn)制表示來(lái)說(shuō),是無(wú)限長(zhǎng)的值(下面的數(shù)字省掉了隱含的1)..

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

0010100011110101110000101000111101011100001010001111 

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

0010001111010111000010100011110101110000101000111101

而兩者的二進(jìn)制, 如果只是通過(guò)這52位計(jì)算的話(huà),分別是: 

0.58 -> 0.57999999999999996 

0.57 -> 0.56999999999999995

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

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

可見(jiàn),這個(gè)問(wèn)題的關(guān)鍵點(diǎn)就是:“你看似有窮的小數(shù),在計(jì)算機(jī)的二進(jìn)制表示里卻是無(wú)窮的”

四,float(浮點(diǎn)數(shù))比較的問(wèn)題

最近在開(kāi)發(fā)一個(gè)合同管理系統(tǒng)的時(shí)候,涉及到兩個(gè)浮點(diǎn)數(shù)比較,算是把我郁悶慘了。

在N久以前,就不曉得從哪里聽(tīng)來(lái)的一個(gè)“不要用等號(hào)去比較浮點(diǎn)數(shù)”的“真理”,自己平時(shí)也在用,好像沒(méi)有出現(xiàn)啥問(wèn)題,可這次問(wèn)題總算是來(lái)了,實(shí)例代碼如下:

  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. 結(jié)果是: 
  12. float(12300)  
  13. float(12300)  
  14. bool(false) 
  15. */ 

后來(lái)才知道在PHP中,要比較兩個(gè)浮點(diǎn)數(shù)的大小,可以用bccomp(參數(shù)1,參數(shù)2,小數(shù)位)來(lái)比較,實(shí)例代碼如下:

  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. 結(jié)果: 
  12. float(12300)  
  13. float(12300)  
  14. int(0) // 0表示兩個(gè)浮點(diǎn)數(shù)值相等 
  15. */ 

bccomp函數(shù)具體用法參與PHP手冊(cè).

生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線(xiàn)----------------------------
分享到:
------分隔線(xiàn)----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 又爽又大又黄a级毛片在线视频 | 久久精品成人热国产成 | 国产精品视频免费观看 | 三级黄色网络 | 在线看的毛片 | 欧美网站在线 | 亚洲综合三区 | 国产精品日韩一区 | www.av一区| 久久久久91 | 91夜夜蜜桃臀一区二区三区 | 国产精品久久久久久久久免费相片 | 精品亚洲一区二区三区 | 久久久精品网站 | 不卡一区在线 | 精品国产a | jizz日本| 久久精品视频在线观看 | 久久国产欧美一区二区免费 | 国产一区亚洲一区 | 躁躁躁日日躁网站 | 国产视频中文字幕 | 日韩精品 电影一区 亚洲 | 成人黄色片免费看 | 91精品国产人妻国产毛片在线 | av免费网 | 国产精品不卡在线 | 欧美成人黄色 | 成人国产精品入口免费视频 | 欧美日韩免费视频 | 成人在线网址 | 不卡一区二区三区四区 | 久久久国产精品一区二区三区 | 欧美第一区 | 一区二区三区在线观看视频 | 狠狠色伊人亚洲综合成人 | 黄色三级免费 | 99免费视频| 在线婷婷| 日韩精品电影在线观看 | 345成人看片 |