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

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > php 浮點數精度值實例程序詳解

php 浮點數精度值實例程序詳解

來源:程序員人生   發布時間:2014-05-03 15:08:27 閱讀次數:3205次

php中浮點數的精度值是用來控制輸出該浮點數時使用的,可以理解為控制輸出的位數,精度值不同,看到輸出結果也可能不一樣,注意:其內部還是按照實際值存儲的,當兩個浮點數進行四則運算時,用的還是其本來的值。

php的配置文件中使用precision來設定全局指定浮點數的精度值,似乎每個發行版,它的默認設置都不太一樣,我在window下看到是12,在linux下看到此值是14,當然也可以通過程序中使用ini_set來改變全局設置,例如:

ini_set("precision", "15");

對于精度我一直理解為小數點后保留多少,那么在php的浮點數中是這樣的么?答案是否定的。

浮點數其實是整數部分和小數部分組成,這里的精度是指整數部分的位數加小數部分的位數不能超過其精度最大值,如果超過,則按照四舍五入的方法截斷到最大的精度值。整數部分如果是0,則不計位數,小數部分末尾0也不計入位數。另外對于同一個數,precision的不同,可能顯示的出來表現形式也不一樣。下面通過例子的方式來說明。

整數部分為 0 情況,代碼如下:

  1. $num = 0.12345600000000000; 
  2.  //整數部分為0 ,位數為 0 ,小數部分末尾的 0 不計入位數,所以總位數為 6 
  3.  ini_set("precision""12"); 
  4.  echo $num// 0.123456 
  5.  //未超過精度值,顯示的結果為 0.123456 
  6.  ini_set("precision""3"); 
  7.  echo $num// 0.123 
  8.  //超過精度值,保留3位 
  9.  ini_set("precision""5"); 
  10.  echo $num// 0.12346 
  11.  //超過精度值,保留5位這種情況下,精度值等價于小數點后保留幾位。 

整數部分大于 0 情況,代碼如下:

  1. $num = 12.12345600000000000; 
  2.  //整數部分為12 ,位數為 2 ,小數部分末尾的 0 不計入位數,位數為6,所以總位數為 2 + 6 
  3.  ini_set("precision""12"); 
  4.  echo $num// 12.123456 
  5.  //未超過精度值,顯示的結果為 12.123456 
  6.  ini_set("precision""3"); 
  7.  echo $num// 12.1 
  8.  //超過精度值,整數部分位數為 2 ,所以只保留一位小數 
  9.  ini_set("precision""5"); 
  10.  echo $num// 12.123 
  11.  //超過精度值,整數部分位數為 2 ,所以只保留3位小數可以看到小數點后保留的位數跟精度已經整數部分的位數有關。 

整數部分大于 0 情況 之二,代碼如下:

  1. $num = 12345678.12345600000000000; 
  2. //整數部分為12345678 ,位數為 8 ,小數部分末尾的 0 不計入位數,位數為6,所以總位數為 8 + 6 
  3. ini_set("precision""12"); 
  4. echo $num// 12345678.1235 
  5. //超過精度值,顯示的結果為 12345678.1235 
  6. ini_set("precision""3"); 
  7. echo $num// 1.23E+7 
  8. //超過精度值,且整數部分位數超過精度,小數部分舍棄,且整數部分只取3位 
  9. ini_set("precision""5"); 
  10. echo $num// 12346000 
  11. //超過精度值,且整數部分位數超過精度,小數部分舍棄,且整數部分只取5位 

上述例子中可以看到,精度值也關系到整數部分的截取,注意到最后兩個例子中顯示的方式不一樣,一個是使用科學計數法,一個是后面用 0 補,通過實驗得出的結論是當整數部分的位數減去 精度值 大于 4 的時候,使用科學計數法的方式,否則后面用 0 補,換句話說,就是整數部分位數超過精度值后,截斷后,補 0 的個數不會超過 4.

浮點數運算,代碼如下:

  1. $num1 = 1331625729.687; 
  2.  $num2 = 1331625730.934; 
  3.  ini_set("precision""8"); 
  4.  echo $num1 . ' 
  5. '; 
  6.  echo $num2 . ' 
  7. '; 
  8.  $sub = $num1 - $num2
  9.  echo $sub . ' 
  10. '; 
  11. //輸出的結果為: 
  12. /* 
  13.  1331625700 
  14.  1331625700 
  15.  -1.247 
  16. */ 

上述例子就說明了精度值只是控制顯示結果,內部存儲還是原始值,所以 $sub 的值為1331625729.687減1331625730.934。

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.   1315537636.338467 
  9.   1315537636.3385 
  10.   1315537636.3385 
  11. */ 

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

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 国产精品视频免费一区二区三区 | 97欧美在线看欧美视频免费 | 欧美freesex呦交6_10 | 黄色毛片免费网站 | 日韩欧美一区二区三区不卡在线 | 美国一级黄色毛片 | 欧美亚洲高清日韩成人 | 国产香蕉在线精彩视频 | 国内性生活视频 | 另类小说图片 | 一区二区不卡视频 | 亚洲伊人影院 | 欧美6699| 欧美极品尤物在线播放一级 | 国产产一区二区三区久久毛片国语 | 2020欧美极品hd18 | 国产日韩视频在线观看 | 一级毛片短视频 | 狂野欧美性猛交xxxx乱大交 | 18欧美同性videos可播放 | 秋霞理论最新三级理论最 | 欧美熟妇下面毛毛黑森林 | 538在线视频二三区视视频 | 桃花福利视频在线观看 | 亚洲黄色网址在线观看 | 岛国福利片 | 亚洲国产最新 | 99久久999久久久综合精品涩 | 国产成人咱精品视频免费网站 | 久久亚洲精品一区成人 | 亚洲综合精品一区二区三区中文 | 豆国产97在线 | 欧洲 | 手机在线看片福利盒子 | 手机看片日韩日韩韩 | 好大好爽好舒服 | 天天亚洲综合 | 一区二区三区在线视频播放 | 波多野吉衣 免费一区 | 国产香蕉一区二区精品视频 | 亚洲图片 自拍 | 一二三四在线观看视频 |