多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

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

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

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

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

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

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

說明:float ceil (float value)

返回不小于 value 的下一個(gè)整數(shù),value 如果有小數(shù)部分則進(jìn)一位。ceil() 返回的類型仍然是 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)類型取整之floor — 舍去法取整

說明:float floor (float value)

返回不大于 value 的下一個(gè)整數(shù),將 value 的小數(shù)部分舍去取整。floor() 返回的類型仍然是 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)類型取整之round — 對(duì)浮點(diǎn)數(shù)進(jìn)行四舍五入

說明: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)類型取整之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í)都有問題,導(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. */ 

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

三,一個(gè)常見問題的解答

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

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

為啥輸出57

為啥輸出是57啊? PHP的bug么?我相信有很多的同學(xué)有過這樣的疑問,因?yàn)楣鈫栁翌愃茊栴}的人就很多,更不用說bugs.php.net上經(jīng)常有人問…

要搞明白這個(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)制表示來說,是無限長(zhǎng)的值(下面的數(shù)字省掉了隱含的1)..

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

0010100011110101110000101000111101011100001010001111 

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

0010001111010111000010100011110101110000101000111101

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

0.58 -> 0.57999999999999996 

0.57 -> 0.56999999999999995

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

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

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

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

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

在N久以前,就不曉得從哪里聽來的一個(gè)“不要用等號(hào)去比較浮點(diǎn)數(shù)”的“真理”,自己平時(shí)也在用,好像沒有出現(xiàn)啥問題,可這次問題總算是來了,實(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. */ 

后來才知道在PHP中,要比較兩個(gè)浮點(diǎn)數(shù)的大小,可以用bccomp(參數(shù)1,參數(shù)2,小數(shù)位)來比較,實(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)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 国产不卡精品一区二区三区 | 日韩欧美爱爱 | 国产suv精品 | 久久亚洲日本不卡一区二区 | 2020久久精品国产免费 | 自拍偷自拍亚洲精品情侣 | 韩国v欧美v亚洲v日本v | 一区二区三区四区国产 | 中文字幕在亚洲第一在线 | 中文国产成人精品久久一区 | 91亚洲国产成人久久精品网站 | xxxx性欧美 | 尤物污 | 亚洲精品视频在线播放 | 在线观看日本一区 | 国产精品久久久久久一区二区三区 | 手机在线观看视频 | 中文天堂在线视频 | 国产成人短视频在线观看免费 | 最近中文字幕免费国语 | 狠狠干天天爱 | 老司机午夜精品99久久免费 | 久久综合欧美成人 | 尤物网址在线观看日本 | 亚洲天堂免费在线视频 | 国产高清在线看免费视频观 | 欧美日韩亚洲高清老妇性 | 亚洲精品国产不卡在线观看 | 在线观看 a国v | 欧美性淫爽www视频播放 | 国产aaa女人十八毛片 | 秋霞理论一级在线观看手机版 | 欧美双渗透 | 亚洲激情小视频 | 噜噜噜在线观看播放视频 | 99精品国产在这里白浆 | 美国爱爱片视频在线观看 | 久久久久久久久久久9精品视频 | 欧美日韩精品一区二区三区四区 | 亚洲国产一区视频 | 91亚洲精品成人一区 |