php中json_decode长整型传输问题

近日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导致精度丢失

 

如有错漏,欢迎指出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值