PHP解析JSON后浮点数丢失末尾零,如何保留4位小数且不转字符串
首先明确核心逻辑:PHP 浮点型的存储机制决定了500.0000和500是完全相同的 float 值,不存在「保留4位末尾零的float类型」这种数据格式,你之前尝试修改变量本身的思路是行不通的,问题本质是要让json_encode输出的数值格式和上游提交的原始格式完全一致。
可行解决方案
方案1:使用JSON_PRESERVE_ZERO_FRACTION参数(推荐,适配PHP 5.6.6及以上版本)
PHP 5.6.6版本新增了JSON_PRESERVE_ZERO_FRACTION JSON编码常量,作用是强制浮点型数值保留小数部分,不会自动省略末尾的零。配合精度配置即可满足需求:
// 全局设置精度,避免小数被自动截断(也可以在php.ini中配置) ini_set('serialize_precision', 14); $shared_key = 'someKey'; $hash_params = [ 'Amount' => $data['Amount'], 'TransactionId' => $data['TransactionId'], ]; // 编码时添加JSON_PRESERVE_ZERO_FRACTION参数 $hash_string = json_encode($hash_params, JSON_PRESERVE_ZERO_FRACTION) . $shared_key; $hash = hash('sha256', $hash_string); if($hash != $data['PublicKey'] ) { die("hash check failed"); }
方案2:手动构造哈希源字符串(兼容所有版本,格式完全可控)
如果你的PHP版本不支持上述常量,或者需要严格固定输出4位小数,可以手动拼接JSON格式字符串,完全避开PHP自动编码的格式问题:
$shared_key = 'someKey'; // 将Amount格式化为4位小数的纯数字字符串,不加引号 $amount_format = sprintf('%0.4f', $data['Amount']); // 手动构造JSON部分,注意字段顺序、键名必须和上游哈希计算的规则完全一致 $json_part = sprintf('{"Amount":%s,"TransactionId":%d}', $amount_format, $data['TransactionId']); // 拼接密钥生成哈希源 $hash_string = $json_part . $shared_key; $hash = hash('sha256', $hash_string); if($hash != $data['PublicKey'] ) { die("hash check failed"); }
注意事项
- 使用方案2时,必须保证JSON部分的字段顺序、键名、符号和上游计算哈希的规则完全一致,不要额外添加空格、换行等多余字符
- 如果示例中的键名实际为
WithdrawAmount,需要对应修改手动拼接的键名,保持和上游对齐
内容的提问来源于stack exchange,提问作者hretic
相关产品推荐
相关产品推荐

