开发语言:lua5.4.3
问题现象:浮点数 例如:92674799.9999999通过 CJSON转换之后,会被执行FLOOR成整数92674800
参考文章和代码:cJSON精度丢失问题-aquester-ChinaUnix博客
问题的原因出在cJSON的print_number函数:
static char *print_number(cJSON *item)
{
char *str;
double d = item->valuedouble;
if (fabs(((double) item->valueint) - d) <= DBL_EPSILON && d <= INT_MAX
&& d >= INT_MIN)
{
str = (char*) cJSON_malloc(21); /* 2^64+1 can be represented in 21 chars. */
if (str)
sprintf(str, "%d", item->valueint);
}
else
{
str = (char*) cJSON_malloc(64); /* This is a nice tradeoff. */
if (str)
{
if (fabs(floor(d) - d) <= DBL_EPSILON)
sprintf(str, "%.0f", d);
else if (fabs(d) < 1.0e-6 || fabs(d) > 1.0e9)
sprintf(str, "%e", d);
else
sprintf(str, "%f", d);
}
}
return str;
}
问题延伸发现:WPS也会有此操作,不过精度更差,2位以上的小数就会执行floor转换显示。刚好用的wps查看源数据,LUA加载之后,cjson输出,两边都将浮点数转成了整数,隐藏了问题。