免费PHP万能建站系统_社区团购SaaS_商城系统_软件开发_虚拟币交易所系统_矿机系统_微信钻石投票系统_成品源码
标题: php保留两位小数时后面会有很长多余的数 [打印本页]
作者: admin 时间: 2022-7-23 17:51
标题: 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服务让其生效!!
欢迎光临 免费PHP万能建站系统_社区团购SaaS_商城系统_软件开发_虚拟币交易所系统_矿机系统_微信钻石投票系统_成品源码 (https://ourphp.net/club/) |
Powered by Discuz! X3.2 |