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類型,為何最后少了一位呢又? 暫時不明白