MALOUDA-PSA 2025-01-19 11:33 采纳率: 85.6%
浏览 9
已结题

浮点数计算输出结果不对


double ibox = 0;
        

        // 检查连续条目
        if (checkConsecutiveEntries(pHisDat, readnum) && checkMinConsecutiveEntries(pHisDat, readnum))
        {
            if (dminbox < dmaxbox)
            {
                ibox = (dmaxbox - dminbox)/ dminbox *100;
            }
        }
        if (ibox>Value[1] && ibox < Value[2])
        {
            memset(pricetext, 0, AAAALENGTH);
                sprintf_s(pricetext, AAAALENGTH, "ibox: %.2f; -code: %s,-dmaxbox: %2.f, dminbox: %.2f \n", ibox, Code, dmaxbox, dminbox);
                writeSqlToFile(pricetext);
                nRet = TRUE;
        }
        



ibox: 7.22; -code: 000565,-dmaxbox: 5, dminbox: 4.99

ibox = (dmaxbox - dminbox)/ dminbox *100;

为什么ibox 计算结果为 7.22

  • 写回答

2条回答 默认 最新

  • 关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    根据您提供的代码片段和输出信息,您遇到的问题是关于浮点数计算的结果。您提到 ibox 的计算结果是 7.22,基于给出的表达式 ibox = (dmaxbox - dminbox) / dminbox * 100;,我们可以分析这个问题。

    假设 dmaxbox 的值是 5,而 dminbox 的值是 4.99。根据表达式计算:

    ibox = (5 - 4.99) / 4.99 * 100
         = 0.01 / 4.99 * 100
         = 0.20 * 100
         = 20 / 100 (或近似为 0.2 或 2%) 但不应该是 7.22。
    

    根据您给出的输出信息,实际计算结果 ibox: 7.22 与理论计算结果不符。可能存在以下几个原因:

    1. 浮点数精度问题:浮点数计算有时会因为精度问题导致微小的差异。尽管理论上计算结果是 0.2 或近似值,实际在计算机中的表示可能因为精度损失而出现微小的偏差。但这通常不会导致这么大的差异。
    2. 代码其他部分的影响:可能存在其他代码部分修改了 ibox 的值,这部分代码没有在您提供的片段中显示。
    3. 编译器或平台差异:不同的编译器或平台可能对浮点数的处理方式略有不同,导致微小的差异。

    为了解决这个问题,您可以尝试以下方法:

    • 检查是否有其他代码部分修改了 ibox 的值。
    • 使用更高精度的数据类型(如 doublelong double)进行浮点计算。
    • 使用更精确的浮点计算库(如 GMP 或任意高精度库)。但通常情况下,普通双精度浮点数在大部分场景下应该是足够用的。除非遇到特别需要高精度的场合或者非常大的数字。在此场景下可能没有明显的优势去使用更复杂的数学库来解决简单的小数运算问题。更常见的解决方法可能是使用定点数运算或者检查是否有其他部分的代码修改了这些变量的值。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月27日
  • 已采纳回答 1月19日
  • 创建了问题 1月19日