关于 php 7 json_encode 浮点数溢出

简单的给大家还原一下案发现场:bowtie: :fa-search:

<?php
`echo json_encode(277.2);// 输出结果为: 277.199999999999989

刚开始我把浮点数转成字符串,但是然并软
看到这结果时, 便猜测是有效数字位数的问题导致了溢出, PHP怎么会有这么蠢的设计呢?这是我当时的想法. 以后少用浮点数 :tw-1f232:

然后想着是不是能从源码下手, 于是查了下php源码, 发现这段代码:

static inline void php_json_encode_double(smart_str *buf, double d, int options)
{
    size_t len;
    char num[PHP_DOUBLE_MAX_LENGTH];

    php_gcvt(d, (int)PG(serialize_precision), '.', 'e', num);
    len = strlen(num);
    if (options & PHP_JSON_PRESERVE_ZERO_FRACTION && strchr(num, '.') == NULL && len < PHP_DOUBLE_MAX_LENGTH - 2) {
        num[len++] = '.';
        num[len++] = '0';
        num[len] = '\0';
    }
    smart_str_appendl(buf, num, len);
}

发现和php.ini 文件里面的 serialize_precision 配置项有关系于是修改php.ini, 把它设为16

<?php
echo json_encode(277.2);
// 输出结果为: 277.2
//是不是哼神奇

史大坨博客
请先登录后发表评论
  • 最新评论
  • 总共0条评论