php的小數位數最長多少位


  • 在php中,
    echo 0.1234567890123456;exit; 
    // 結果為:0.12345678901235, 整數部分為0時,最多到14位小數,如果后面還有,就自動四舍五入

    echo 781.1234567890123456;exit;
    // 結果為:781.12345678901, 整數部分為3位數時,最多11位小數 3+11=14

    echo 71231381.1234567890123456;exit;
    // 結果為:71231381.123457   整數為8位數時,最多6位小數   8+6=14
    即PHP中,一個浮點數的長度最多只能有 14個有效位(整數+小數)
  • 出現這種情況的原因是
C中浮點數據類型有float和double兩種。 (PHP中的float即C語言中的double,zval中的value是一個double類型的引用,所以PHP中的浮點數只有double類型)

float大小為4字節,內存中的存儲方式如下:

符號位(1bit)指數(8bit)尾數(23bit)

double大小為8字節,內存中的存儲方式如下:

符號位(1bit)指數(11bit)尾數(52bit)

符號位決定浮點數的正負,0正1負。指數和尾數均從浮點數的二進制科學計數形式中獲取。

如,十進制浮點數2.5的二進制形式為10.1,轉換為科學計數法形式為(1.01)*(10^1)。

由此可知指數為1,尾數(即科學計數法的小數部分)為01。

 根據浮點數的存儲標准,指數用移碼表示。0的float類型移碼為127(0111 1111),0的double類型移碼為1023(011 1111 1111)。運算時,在0 的移碼基礎上加指數,得到的就是內存中指數的表示形式。尾數則直接填入,如果空間多余則以0補齊,如果空間不夠則0舍1入。

所以float和 double類型分別表示的2.5如下(二進制):

符號位               指數                                       尾數

0                     1000 0000                             010 0000 0000 0000 0000 0000

0                     100 0000 0000 0100                    0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

 

精度:

 float和double的精度是由尾數的位數來決定的。

 float:2^23 = 8388608,一共七位,這意味着最多能有7位有效數字,但絕對能保證的為6位,也即float的精度為6~7位有效數字; double:2^48 = 281474976710656,一共15位,
 同理,double的精度為14~15位。
 

但是 double 到了 PHP 中則只有 13~14 位了,有點不明白,PHP的float類型明明是指向一個C語言double類型,為何最后少了一位呢又? 暫時不明白


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM