近日A项目存储B项目中发过来的json串中的长整型时,发现两个项目mysql中存储的不一致:一共是18位长整型,但在最后两位不一样。
A项目语言是php5.6.38,B项目是go
A项目mysql该字段是varchar(255),B项目是bigInt(64)
起初认为是json_decode时精度丢失问题,找到了php官方的json_decode,发现有相应的例子: php json_decode Example #5
本地用以下代码尝试:
$str = '{"uuid": 248624693275679345}';
$arr = json_decode($str, true);
echo $arr['uuid'];
发现输出的也是 248624693275679345(线上保存到数据库的是248624693275679360),没有使用json_decode的第四个参数: JSON_BIGINT_AS_STRING,精度依旧没有丢失
因为使用的是docker,本地和线上的环境是一致的
最后在翻找代码时,发现一个同事为了防止精度丢失,用了这样的方法:
$uuid = number_format($arr['uuid'], 0, '.', '');
此时输出$uuid,就会发现是248624693275679360
为此,请注意:
1. 在传输时大整型尽量转为string(因B项目对接了其他项目,所以不能更改)
2. json_decode时,最好在第四个参数传入JSON_BIGINT_AS_STRING
3. 在使用number_format时,一定要注意这个方法会导致精度丢失
另:本人在使用一个可以将json转换成可视化结构的浏览器插件时,即使输出的是248624693275679345,这个插件也会把字符串改为248624693275679360。估计是在转换时,认为这是数字,js导致精度丢失
如有错漏,欢迎指出