1. 程式人生 > >php json_encode小數精度丟失的問題

php json_encode小數精度丟失的問題

<?php

$arr = [
    'a'=>2.4,
    'b'=>3  
 ];

 print_r($arr);
 /**
  * (
        [a] => 2.4
        [b] => 3
    )
  */

 var_dump(json_encode($arr));//{"a":2.3999999999999999,"b":3}

 /**
  * 明明是2.4  在轉換json的時候 變成了2.3999999999999999
  */

/*  
網上有說法是 php.ini 中 serialize_precision (序列化精度) 的大小來解決這個問題。將這個值改為 小於 17 的數字就解決了這個問題。 
感覺會很麻煩  就在程式碼裡相容把
*/ //可以強行轉成字串來保證精度 $arr = [ 'a'=>(string)2.4, 'b'=>3 ]; var_dump(json_encode($arr));//{"a":2.4,"b":3} /** * 感覺很怪異的樣子 */ //試著用number_format來解決吧 /** * number_format引數說明: * number 必需。要格式化的數字。如果未設定其他引數,則數字會被格式化為不帶小數點且以逗號(,)作為千位分隔符。 * decimals 可選。規定多少個小數。如果設定了該引數,則使用點號(.)作為小數點來格式化數字。 * decimalpoint 可選。規定用作小數點的字串。 * separator 可選。規定用作千位分隔符的字串。僅使用該引數的第一個字元。比如 "xxx" 僅輸出 "x"。 * 註釋:如果設定了該引數,那麼所有其他引數都是必需的。
*/ $arr = [ 'a'=>fix_number_precision(2.4), 'b'=>3 ]; var_dump(json_encode($arr));//{"a":2.4,"b":3} /** * 借鑑網上的函式 */ /** * @param $data 需要處理的資料 * @param int $precision 保留幾位小數 * @return array|string */ function fix_number_precision($data, $precision = 2) { if(is_numeric($data
)){ $precision = is_float($data) ? $precision : 0; return number_format($data, $precision, '.', ''); } if(is_array($data)){ foreach ($data as $key => $value) { $data[$key] = fix_number_precision($value, $precision); } return $data; } return $data; }