修復 PHP7.1、7.2beta 中 JSON_encode () 處理 float/double 型數值時溢位的問題

Ίκαρος發表於2017-09-09

在 PHP7.1、7.2beta 中,使用 json_encode() 函式處理 float/double 型數值時會出現溢位。
對此,我參考網上的方法寫了一個 package ,歡迎使用 ^_^ 。

感謝 @ElfSundae 解答,這個問題確實是由於 php.iniserialize_precision 項中配置不當引起的,是我理解錯了。
PHP 官方 WIKI 在此:https://wiki.php.net/rfc/precise_float_val...

示例

  >>> $a = 0.1 + 0.7
  => 0.8
  >>> printf('%.20f', $a)
  => 0.79999999999999993339
  >>> json_encode($a)
  => "0.7999999999999999"
  >>> \YaJson::encode($a)
  => "0.8"

用法

  1. 修復精度並進行 json_encode

    $data = [
      'a' => 0.1 + 0.7,
      'b' => ['string1', 'string2'],
    ];
    
    \YaJson::encode($data);
  2. 只獲取修復後的資料,不進行 json_encode

    $data = [
      'a' => 0.1 + 0.7,
      'b' => ['string1', 'string2'],
    ];
    
    \YaJson::prepare($data);

安裝

  1. 安裝包檔案

    composer require "seekerliu/laravel-another-json:dev-master"

配置

Laravel 5.5

Laravel 5.5 安裝新包後會預設執行 @php artisan package:discover 命令,所以可以不進行下面的操作。

  1. 註冊 ServiceProviderFacade:

    php artisan package:discover
  2. 如需修改預設迴圈深度、精度位數,則建立配置檔案:

    php artisan vendor:publish

Laravel 5.4 及以下

  1. 註冊 ServiceProviderFacade:

    'providers' => [
      //...
    
      Seekerliu\YaJson\ServiceProvider::class,
    ],
    
    'aliases' => [
      //...
    
      'YaJson' => Seekerliu\YaJson\Facade::class,
    ],
  2. 如需修改預設迴圈深度、精度位數,則建立配置檔案:

    php artisan vendor:publish --provider="Seekerliu\YaJson\ServiceProvider"

Github: https://github.com/seekerliu/laravel-anoth...
感謝博主提供的思路: http://www.itread01.com/articles/148977474...

本作品採用《CC 協議》,轉載必須註明作者和本文連結

原創。 所有 Laravel 文章均已收錄至 Github laravel-tips 專案。

相關文章