php保留两位小数时后面会有很长多余的数

今天在使用php写接口给前端返回数据时,使用round函数对一些数据进行保留两位有效数字操作,结果却大跌眼镜。。。

问题复现

$data['number'] = round(0.0322222,2);
echo json_encode($data);  
//echo {"number":0.0299999999999999988897769753748434595763683319091796875}

解决方案1

将数字以字符串方式返回

$data['number'] = round(0.0322222,2).'';  // 这里连接个空字符串将其整个变为字符串
echo json_encode($data);  //echo {"number":"0.03"}

解决方案2

万一强迫症就是不想返回字符串,非要返回数字。比如我,安排

其实这个问题并不是因为round()引起的,划重点,是json_encode()引起的!!

禀着把我知道的都吐出来,看下相关源码:

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);
}

其中有一个配置项值:serialize_precision,于是到php.ini中找一下配置项,发现我的值是100,将其改为(-1)。

别忘了重启php服务让其生效!!

$data['number'] = round(0.0322222,2);
echo json_encode($data);  //echo "number":0.03}

大功告成。

究其原因

咋还跳着看呢,细看解决方案2去!

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值