首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    由Long类型引发的生产事故

    今天测试忽然在群里发了一个看似非常简单的线上问题,具体是:在后台通过订单编号(orderId)修改订单信息时,修改不成功 ,修改前后的订单数据完全没有发生变化。第一眼看到这个问题的时候,我心想后台实现逻辑并不就是一个updateById更新订单表的操作(简化了其他业务逻辑)吗?难道订单编号(orderId)在代码里给属性赋值赋错了,心想这么低级的错误“同事”应该不会犯吧,于是我就打开ide先去看了看对应方法的处理逻辑,整体更新操作 属性之间的赋值没有问题,难道又是一个”灵异事件“?说罢 我便想着在测试环境能不能复现一下这个bug,功能上线前功能肯定是测试通过的,于是我在测试环境点啊点,在页面上模拟了几十次更新操作也没有发现问题。

    03

    cJSON精度丢失问题

    问题复现步骤: 1) 输入字符串: {     "V":0.12345678 } 2) 字符串转成cJSON对象 3) 调用cJSON_Print将cJSON对象再转成字符串 4) 再将字符串转成cJSON对象 5) 保留8位精度方式调用printf打印值,输出变成:0.123456 问题的原因出在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; } 最后一个sprintf调用没有指定保留的精度,默认为6位,这就是问题的原因。 注:float的精度为6~7位有效数字,double的精度为15~16位。

    02
    领券