简单的给大家还原一下案发现场: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
//是不是哼神奇
本文为史大坨原创文章,转载无需和我联系,但请注明来自史大坨博客https://www.shidatuos.cn