iT邦幫忙

0

PHP json_encode 0.0000 浮點數問題

求教,最近在跟客戶串接api的時候,對方傳來的資料為 0.000, 但php json_encode(0.000) 後的值 會是0,有找到相關的參數
json_encode(0.000, JSON_PRESERVE_ZERO_FRACTION)後的值會是 0.0,
不知有何方法可以讓編碼後的值依然是 0.000, 對方說他那邊不能改要我這邊想辦法。

主要是會依對方那邊傳來的time+request body去做 hash 所以我這邊也沒辦法去將0.000改成 0 再 json_encode 因為hash值會不一樣,交易就會失敗。

補充一下,因為會確認雙方的hash值一致,所以我這邊是無法將 0.000 改為字串去做json_encode 因為最後出來的hash值會與對方不一致。

<?php

$v=0.0000;
echo json_encode($v).'</br>';//0
echo json_encode($v, JSON_PRESERVE_ZERO_FRACTION).'</br>';//0.0

再補充一下程式碼,字串與浮點數json_encode後所取的md5是不一樣的,所以在我這邊轉字串也不可行。

<?php
$aa='0.0000';
$bb=0.0000;
echo md5(json_encode($aa)).'</br>';//aaf4b6b29517563a3c5fc7f90c6a57ee
echo md5(json_encode($bb)).'</br>';//cfcd208495d565ef66e7dff9f98764da
只要是POST/GET來的,一律當成STRING處理
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

2
小魚
iT邦大師 1 級 ‧ 2021-04-14 12:43:14

對方傳過來不是應該要decode嗎?
應該是要當成文字來處理吧,
只是不知道PHP會不會自動轉成數字XD

1
淺水員
iT邦大師 6 級 ‧ 2021-04-14 12:47:13

真的為了配合對方的話,我想到的是這樣

<?php
$symbol='###';
$v="{$symbol}0.000{$symbol}";
echo preg_replace("/\"$symbol|$symbol\"/" , '', json_encode($v));
淺水員 iT邦大師 6 級 ‧ 2021-04-14 17:38:10 檢舉

我對提問的理解

客戶呼叫我們的 API,這個 API 需要客戶傳來:

  1. 欄位資料:此API會用到的參數,可能有數個。例如:user=1&num=2.000 這種。
  2. hash:對方自行 hash 的值,我們這個 API 要驗證這個 hash 代表是對方傳來的。

問題的發生

json 本身可以自由換行、加空格、object key 沒有順序等

我的作法

這種API我會請對方直接傳:

  1. json:參數都塞這裡
  2. hash:對上面的 json 取 hash

這樣可以避免客戶 json 寫法不同的問題

混水摸魚 iT邦研究生 2 級 ‧ 2021-04-15 10:35:29 檢舉

大大的理解是對的,但主要造成問題的點是 json_encode 對於 0.000 會解析成 0 ,若值是 0.001都是沒問題的。
我想請客戶把 預設的 0.000 改成 0.0 或是 0 都是被拒決,感覺很無言。

我覺得最討厭的是對方完全不想改code,造成hash錯誤的欄位還是可刪除的欄位,串接時根本用不到。

我要發表回答

立即登入回答