2017-05-09 57 views
4

PHP似乎有a bug處理json_encode中的十進制精度的方式。如何json_encode在PHP 7.1.1中浮點值?

這很容易通過編碼一個簡單的浮動看到的只是:

echo json_encode(["testVal" => 0.830]); 

// Prints out: 
{"testVal":0.82999999999999996003197111349436454474925994873046875} 

我沒有太大的服務器管理的,所以除了去到php.ini並改變serialize_precision爲-1,是有在我的代碼中可以做的任何事情來防止這種情況發生,當我無法確定它是否在該設置已更改的環境中運行時?

編輯: 我敢肯定,一些意見將希望鏈接到爲什麼浮點不精確存在的一般討論。我知道。我的問題是關於在PHP中處理它的最佳實踐,以及是否有防禦性代碼的方法。當然,有比將花車作爲字符串發送更好的方法。

+0

會發生這種情況在7.0呢? –

+0

正如您關於錯誤報告的討論清楚地表明的那樣,這不是一個錯誤,而是一個故意的特徵。如果您的服務器配置爲高精度地序列化浮點數,那麼'json_encode'現在就會尊重這一點。 – IMSoP

+0

如果你將該值寫入字符串?那麼你有你想要的確切數字。 – Stony

回答

6

您應該配置'precision'和'serialize_precision'參數。

precision = 14 
serialize_precision = -1 

測試用例:

php -r 'ini_set("precision", 14); ini_set("serialize_precision", -1); var_dump(json_encode(["testVal" => 0.830]));' 
string(16) "{"testVal":0.83}" 
+0

鏈接到[文檔更改日誌](// php.net/manual/en/function.json-encode.php#refsect1-function.json-encode-changelog)可能會有幫助,它記錄了更改的內容。特別是,改變'精度'不再對'json_encode'產生影響。 –

+0

@Justastudent謝謝,這對於7.1來說是真的,很多人仍然使用5.6,所以上面的答案對於使用5.6+的所有人都是有用的。 –

+0

是的,我在我原來的問題中提到過。這是最好的解決方案嗎?如果是這樣,爲什麼?有沒有其他的選擇? – GoldenJoe