php中浮點數的精度值是用來控制輸出該浮點數時使用的,可以理解為控制輸出的位數,精度值不同,看到輸出結果也可能不一樣,注意:其內部還是按照實際值存儲的,當兩個浮點數進行四則運算時,用的還是其本來的值。
php的配置文件中使用precision來設定全局指定浮點數的精度值,似乎每個發行版,它的默認設置都不太一樣,我在window下看到是12,在linux下看到此值是14,當然也可以通過程序中使用ini_set來改變全局設置,例如:
ini_set("precision", "15");
對于精度我一直理解為小數點后保留多少,那么在php的浮點數中是這樣的么?答案是否定的。
浮點數其實是整數部分和小數部分組成,這里的精度是指整數部分的位數加小數部分的位數不能超過其精度最大值,如果超過,則按照四舍五入的方法截斷到最大的精度值。整數部分如果是0,則不計位數,小數部分末尾0也不計入位數。另外對于同一個數,precision的不同,可能顯示的出來表現形式也不一樣。下面通過例子的方式來說明。
整數部分為 0 情況,代碼如下:
整數部分大于 0 情況,代碼如下:
整數部分大于 0 情況 之二,代碼如下:
上述例子中可以看到,精度值也關系到整數部分的截取,注意到最后兩個例子中顯示的方式不一樣,一個是使用科學計數法,一個是后面用 0 補,通過實驗得出的結論是當整數部分的位數減去 精度值 大于 4 的時候,使用科學計數法的方式,否則后面用 0 補,換句話說,就是整數部分位數超過精度值后,截斷后,補 0 的個數不會超過 4.
浮點數運算,代碼如下:
上述例子就說明了精度值只是控制顯示結果,內部存儲還是原始值,所以 $sub 的值為1331625729.687減1331625730.934。
PHP內置的echo, var_dump,json_encode,字符串拼接等函數(指令)在顯示浮點數時都有問題,導致精度丟失.實例代碼如下:
也就是說,用PHP最順手的方法將浮點數轉成字符串或者顯示是不行的,必須使用printf/sprintf將浮點數轉成字符串.