2019-11-13 PHP7.x json_encode() Float Issue

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2019-11-13 PHP7.x json_encode() Float Issue相关的知识,希望对你有一定的参考价值。

参考技术A 在使用 json_encode()返回浮点类型数据时会出现精度问题

可以从实现源码看出所不同的是php5.x采用的是precision的值来作为精度运算的
而php7.x采用的是serialize_precision的值
这就导致了同样的配置,不同的php版本,所得到的结果是不同的
在php7.x中serialize_precision =17
所以浮点数会保留17位的精度
"a":0.17999999999999999

1、更改php_ini中 serialize_precision = 17 值为14
2、在运行时动态修改serialize_precision的配置值
在使用json_encode函数前使用

设置serialize_precision值。
3、更改json_encode中传入数组的值是浮点数类型的改为字符串类型,跳过json_encode对浮点数的处理机制

原文的意思就是说设置

这将会采用一种更好的,新的算法进行精度运算

不讨论将浮点数类型的改为字符串类型的方案,只讨论serialize_precision 的取值在为-1,14,17时的性能对比

当值为-1时, 运算结果为0.63303589820862 times
当值为14时,运算结果为0.43502497673035 times
当值为17时,运算结果为1.3600780963898 times

这个问题的本质原因是由于PHP浮点数精度问题,但引发此问题的原因却是json_encode()处理浮点数精度的参数值从使用precision改为使用serialize_precision。

Centos 7.x yum安装php5.6.X(最新版)

1.检查当前安装的PHP包

    yum list installed | grep php       

如果有安装的PHP包,先删除他们

    yum remove php.x86_64 php-cli.x86_64 php-common.x86_64 php-gd.x86_64 php-ldap.x86_64 php-mbstring.x86_64 php-mcrypt.x86_64 php-mysql.x86_64 php-pdo.x86_64  

配置yum源
CentOS 7.0的源。

yum install epel-release
rpm -ivh  http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

使用yum list命令查看可安装的包(Packege)

     `yum list --enablerepo=remi --enablerepo=remi-php56 | grep php`

安装PHP5.6.x
yum源配置好了,下一步就安装PHP5.6。

yum install --enablerepo=remi --enablerepo=remi-php56 php php-opcache php-devel php-mbstring php-mcrypt php-mysqlnd php-phpunit-PHPUnit php-pecl-xdebug php-pecl-xhprof

用PHP命令查看版本。

1. PHP 5.6.38 (cli) (built: Oct 24 2018 12:50:38)  
1. Copyright (c) 1997-2016 The PHP Group
1.  Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
1. with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies
1.  with Xdebug v2.5.5, Copyright (c) 2002-2017, by Derick Rethans****

安装PHP-fpm

   yum install --enablerepo=remi --enablerepo=remi-php56 php-fpm 

在这里安装的版本是PHP5.6.13。

从PHP5.5开始PHP代码缓存从APC变成了Zend OPcache了。

重新启动服务:

        systemctl restart httpd
        systemctl restart php-fpm

以上是关于2019-11-13 PHP7.x json_encode() Float Issue的主要内容,如果未能解决你的问题,请参考以下文章

2019/11/13

linux:安装php7.x

Apache 2.4.23 PHP7.x Windows 10 x64 php_curl 不工作

安装编译PHP7.X

2019-11-13

PHP7.X连接SQLSERVER数据库(CENTOS7)