PHP gmp_init与JS BigInt处理超长16进制数结果不一致如何解决?
问题根因
- 差异本质是
JavaScript端用法错误导致,和PHP的gmp扩展无关。 - JS中直接书写的
0x开头超长16进制会优先被解析为Number类型(双精度浮点数),该类型仅支持最多53位有效整数精度,对应16进制位数约13位,这就是13位以内结果一致的原因。超过13位的16进制数字字面量会先发生精度丢失,再转成BigInt时错误已经产生,和PHP端精确解析的结果自然不一致。
解决方法
两侧都统一传入字符串形式的16进制值,不要直接传入数字字面量即可得到完全一致的结果:
- JavaScript正确写法
// 把16进制值放在引号中作为字符串传入,BigInt会直接按字符串精确解析 const res = BigInt("0x400000000328923310a4110a1044210210a4190810c431061064190610a51102")
- PHP对应写法
// 同样传入带0x前缀的字符串,gmp_init会自动识别16进制做精确解析 $res = gmp_init("0x400000000328923310a4110a1044210210a4190810c431061064190610a51102"); // 输出十进制字符串可使用gmp_strval,结果和JS侧完全一致 echo gmp_strval($res);
内容的提问来源于stack exchange,提问作者Oussama Nm
相关产品推荐
相关产品推荐

