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