You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 23:57:04