#838·cJSON

在修复 clang 编译警告时,在 print_number() 中使用双精度进行回归

作者: samblg创建于 2024年3月7日更新于 2026年9月3日

/* 将给定项中的数字美观地渲染为字符串。 */ static cJSON_bool print_number(const cJSON * const item, printbuffer * const output_buffer) { unsigned char output_pointer = NULL; double d = item->valuedouble; int length = 0; size_t i = 0; unsigned char number_buffer[26] = {0}; / 临时缓冲区,用于将数字打印为字符串 */ unsigned char decimal_point = get_decimal_point(); double test = 0.0; if (output_buffer == NULL) { return false; }

/* 此处检查是否为 NaN 和 Infinity */
if (!compare_double(d * 0, 0))
{
    length = sprintf((char*)number_buffer, "null");
}
else
{
    /* 尝试使用 15 个小数位的精度,以避免无意义的非零数字 */
    length = sprintf((char*)number_buffer, "%1.15g", d);

    /* 检查原始 double 是否可恢复 */
    if ((sscanf((char*)number_buffer, "%lg", &test) != 1) || ((double)test != d))
    {
        /* 如果不是,则使用 17 个小数位的精度打印 */
        length = sprintf((char*)number_buffer, "%1.17g", d);
    }
}

}

内容来源: DaveGamble/cJSON