json-c / json.h中双精度的小数位数

时间:2019-07-01 12:38:26

标签: c json format

我需要在JSON对象中使用很小的双打。数组的输出类似于:

{"array":[[1,0.050000],[2,0.030000]...]}

我正在使用的代码是:

json_object *jobj = json_object_new_object();
json_object *jarray1 = json_object_new_array();
json_object *jarray2 = json_object_new_array();
...
// in a for loop:
    json_object *int0 = json_object_new_int (integer_num);
    json_object *db0 = json_object_new_double (double_num);
    json_object_array_add(jarray1, int0);
    json_object_array_add(jarray1, db0);
    json_object_array_add(jarray2, jarray1);
...
json_object_object_add(jobj,"array", jarray2);

使用上面显示的数字可以正常工作。问题是当数字较小时,例如1.6E-10,输出为:

{"array":[[1,0.000000],[2,0.000000]...]}

因此与发送“ 0”相同,这是不希望的。我试过将double转换为text:

sprintf(str,"%.15f", double_num);
db0 = json_object_new_string(str);

但是输出是:

{"array":[[1,"0.000000000093575"],[2,"0.000000000091282"]...]}

,我需要删除那些引号。有没有其他方法可以增加输出数组中的小数位数或使用科学计数法(1.6E-10)?

1 个答案:

答案 0 :(得分:0)

通过使用此函数格式化我的double,我遇到了类似的问题。

#include <json.h>
    struct json_object* json_object_new_double_fmt(double d, const char *fmt)
    
        {
          char tmp[128];
          snprintf(tmp, 128, fmt, d);
          return(json_object_new_double_s(d, tmp));
        }

例如:

  json_object_object_add(jobjPressure, "Pr", json_object_new_double_fmt((double) pressuredata->pressure, "%0.3f"));

我看不到为什么'json_object_new_double_s()'需要第一个double参数,因为第二个char字符串似乎只是按原样使用。不知道这是一个错误还是我对该功能的错误使用。但是我找不到任何有意义的文档或示例代码。似乎可以完成这项工作。