2017-08-07 18 views
2

給定一個浮點數,一個JSON編碼和隨後的解碼,可變類型float(或雙擊)後有時它不保留。PHP JSON有時轉換浮點數爲整數

$n1 = 1.23; 
$json = json_encode($n1); // '1.23' 
$n2 = json_decode($json); 

$t1 = gettype($n1); // 'double' 
$t2 = gettype($n2); // 'double' 

$d = $n1 === $n2; // true 

然而,當小數「0」的結果是不同的:

$n1 = 1.0; 
$json = json_encode($n1); // '1' 
$n2 = json_decode($json); 

$t1 = gettype($n1); // 'double' 
$t2 = gettype($n2); // 'integer' 

$d = $n1 === $n2; // false 

我不得不斷定的JSON編碼/解碼功能的行爲是基於數據值,因此難以預測,並最終相當不一致。

有什麼辦法,以確保在JSON編碼/解碼過程中保持變量的類型?

回答

3

自身的JSON格式,沒有花車和整數的概念,它只是數字。這是它是獨立於語言的數據格式的原因之一。

不過,我發現,json_encode選項JSON_PRESERVE_ZERO_FRACTION的伎倆。

JSON_PRESERVE_ZERO_FRACTION

確保浮點值總是被編碼爲一個浮點值。 自PHP 5.6.6起可用。

它強制json_encode始終將至少一個'0'十進制數字放到JSON表示法中。

json_decode,就其本身而言,是本身能夠與十進制數字編號解釋成float和它不需要任何特殊的標誌。

$n1 = 1.0; 
$json = json_encode($n1, JSON_PRESERVE_ZERO_FRACTION); // '1.0' 
$n2 = json_decode($json); 

$t1 = gettype($n1); // 'double' 
$t2 = gettype($n2); // 'double' 

$d = $n1 === $n2; // true