[問題] json大數字變成了科學符號

作者: renmax (竹科學友哥)   2022-08-02 17:31:19
開發平台(Platform): (Ex: Win10, Linux, ...)
Win10
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
NetBeans + Linux
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
cJson (https://github.com/DaveGamble/cJSON)
問題(Question):
如果json的資料是
{
"str": "4761739001010135",
}
讀取後,將字串轉成數字,使用cJSON_AddNumberToObject後
如預期的得到
{
"num": 4761739001010135
}
但是遇到尾數是零時,相同的程式碼就會變成科學符號
例如,如果json的資料是
{
"str": "4761739001010010"
}
結果得到 (非預期)
{
"num": 4.76173900101001e+15
}
相關程式碼如下:
cJSON *pjNode = NULL;
pjNode = cJSON_GetObjectItem(pInJson, "str");
if (pjNode != NULL)
{
cJSON_AddNumberToObject(pOutJson, "num", atoll(pjNode->valuestring));
}
感覺是大數字才會發生問題,因此想請教一下
1. 為何相同的程式碼,當尾數是0時,會變成科學符號呢?
2. 如何避免/修改成一般的數字,而不是科學符號呢?
麻煩了 感謝
餵入的資料(Input):
預期的正確結果(Expected Output):
錯誤結果(Wrong Output):
程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)
補充說明(Supplement):
作者: Chikei ( )   2022-08-02 18:06:00
作者: renmax (竹科學友哥)   2022-08-03 16:30:00
C大 我是使用cJSON_AddNumberToObject後 去print json內容發現 原本print出來的應該是長整數 但卻顯示科學符號而科學符號 並不是我想要的結果 我希望print出來後 是整數型態 您給的參考網址是取值 而不是塞值 謝謝幫忙>"<
作者: yvb   2022-08-03 16:57:00
cJSON.c 找 Try 15 decimal 看那邊. %1.15g 和 %1.17g 的差別這實作似乎不符合 RFC 8259 第六節 Numbers 的最後一段.可能只參照到 RFC 4627.
作者: Chikei ( )   2022-08-04 13:44:00
人家就說cJSON不支援long long,跟取值還是塞值沒關係。
作者: renmax (竹科學友哥)   2022-08-04 14:15:00
不好意思 如果不支援long long的話 請問一下1. 上方的例子中 為何只有尾數是零 才會變成科學符號呢?2. 有什麼方法 可以做到預期的結果呢?(整數長度MAX = 20)感謝y大和C大幫忙
作者: Chikei ( )   2022-08-04 15:44:00
1. 上面yvb已經回答了 2. 沒有,請看完上面的issue回答
作者: Richun (解放左手的OO之力)   2022-08-05 04:43:00
51 bits換算是15.3位,長度20已經超過了,cJSON不能用。只能找其他的或是fork cJSON自己修
作者: LPH66 (-6.2598534e+18f)   2022-08-05 20:30:00
長度 20 也不能用 double 或 int64_t 來存uint64_t 只能擦邊 (18446744073709551615 正好 20 位)所以任意 20 位的數字可能要建議當字串來用
作者: renmax (竹科學友哥)   2022-08-08 15:26:00
感謝各位大大的解釋 我仍然不太懂y大說的Try 15 decimal這邊的意思 為何特定使用15和17 decimal來做判斷呢?
作者: LPH66 (-6.2598534e+18f)   2022-08-09 03:16:00
double 的精確度是 53 bit, 數學轉換對應十進位約 15.95 位所以一般可能會認為印出 1+15 位數就能足夠表示一個 double但實際上如果要達成所謂的 round-trip (轉成字串再轉回來時要得到完全一樣的 double 數值) 會需要印出 1+17 位才能使某些邊界狀況能夠得到分辨

Links booklink

Contact Us: admin [ a t ] ucptt.com