CJsonObject icon indicating copy to clipboard operation
CJsonObject copied to clipboard

parse_number负double数值解析出来为正值

Open WVito opened this issue 1 year ago • 1 comments

if (scale == 0 && subscale == 0)
{
    item->valuedouble = item->sign * d;
    item->valueint = item->sign * n;
    item->type = cJSON_Int;
}
else
{
    printf("subscale = %d, signsubscale = %d, s = %.16f\n", subscale, signsubscale, d);
    if (subscale != 0)
    {
        d = item->sign * base * pow(10.0, (scale + subscale * signsubscale)); /* number = +/- number.fraction * 10^+/- exponent */
    }

    item->valuedouble = d;
    item->valueint = n;
    printf("d = %.16f, base = %.16f, valuedouble = %.16f\n", d, base, item->valuedouble);
    item->type = cJSON_Double;
}

经测试,负double值时,scale < 0, subscale == 0, item->sign < 0,d值并不会经过d * item->sign,因此解析出来的只会是正值。

WVito avatar Oct 31 '24 17:10 WVito

调用哪个函数获取值的时候负double会取到正值?
如果是 operator() 这个方法,两个月前已修复,更新一下最新代码即可。

Bwar avatar Nov 01 '24 08:11 Bwar

@Bwar 使用Get接口,比如:json_inst["Command"]["Data"].Get("X", px0);这样的场景就会出错。 demo.cpp里面随便加一个负浮点型使用Get接口获取就能复现这个问题。

是不是应该改为: if (subscale != 0) { d = item->sign * base * pow(10.0, (scale + subscale * signsubscale)); /* number = +/- number.fraction * 10^+/- exponent */ } else { d = item->sign * d }

xiaoyilong avatar Aug 07 '25 09:08 xiaoyilong

已修复并提交github。 在家里总是打不开github,加上最近太忙没注意看

------------------ 原始邮件 ------------------ 发件人: "Bwar/CJsonObject" @.>; 发送时间: 2025年8月7日(星期四) 下午5:37 @.>; @.@.>; 主题: Re: [Bwar/CJsonObject] parse_number负double数值解析出来为正值 (Issue #66)

xiaoyilong left a comment (Bwar/CJsonObject#66)

@Bwar 使用Get接口,比如:json_inst["Command"]["Data"].Get("X", px0);这样的场景就会出错。 demo.cpp里面随便加一个负浮点型使用Get接口获取就能复现这个问题。

是不是应该改为: if (subscale != 0) { d = item->sign * base * pow(10.0, (scale + subscale * signsubscale)); /* number = +/- number.fraction * 10^+/- exponent */ } else { d = item->sign * d }

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

Bwar avatar Aug 17 '25 02:08 Bwar