找回密码
 立即注册
即日起,论坛关闭新用户注册和登录,论坛相关的贴子保留查阅和下载。获得授权后,有技术问题可联系微信 13199509559 一对一解决。 2024-3-12
查看: 3407|回复: 0
打印 上一主题 下一主题

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

209

主题

209

主题

209

主题

管理员

Rank: 9Rank: 9Rank: 9

积分
0
跳转到指定楼层
1#
admin 发表于 2022-7-23 17:51:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

问题复现
  1. $data['number'] = round(0.0322222,2);
  2. echo json_encode($data);  
  3. //echo {"number":0.0299999999999999988897769753748434595763683319091796875}
复制代码
解决方案1

将数字以字符串方式返回

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

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

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

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

  1. static inline void php_json_encode_double(smart_str *buf, double d, int options) /* {{{ */
  2. {
  3.     size_t len;
  4.     char num[PHP_DOUBLE_MAX_LENGTH];

  5.     php_gcvt(d, (int)PG(serialize_precision), '.', 'e', num);
  6.     len = strlen(num);
  7.     if (options & PHP_JSON_PRESERVE_ZERO_FRACTION && strchr(num, '.') == NULL && len < PHP_DOUBLE_MAX_LENGTH - 2) {
  8.         num[len++] = '.';
  9.         num[len++] = '0';
  10.         num[len] = '\0';
  11.     }
  12.     smart_str_appendl(buf, num, len);
  13. }
复制代码

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

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



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表