【问题标题】:Am I dividing in the right way in C?我在C中以正确的方式划分吗?
【发布时间】:2020-07-17 14:00:59
【问题描述】:

我需要对三个变量应用一个公式。一些操作(除法)给我一个 0 而不是正确的数字。所以我得到的结果与我对公式的预期不同。

我认为问题与 C 管理数据类型及其余数的方式有关。出于这个原因,我尝试将 int 变量转换为 float 变量或将我划分的数字四舍五入。但是所有这些仍然不起作用,我无法理解我错过了什么。

能否请您看一下我的代码并告诉我错误在哪里? 谢谢

double grade(int lc, int wc, int sc)
{
    wc = (float)wc;
    lc = (float)lc;
    sc = (float)sc;
    float L = round((wc/100)/lc);
    float S = round((wc/100)/sc);
    float index = 0.0588 * L - 0.296 * S - 15.8;
    return index;
}

【问题讨论】:

  • 我怀疑如果你像他们 here 那样做,它应该可以工作。但目前您将其存储回wc,这会导致另一个转换回int。尝试float wc_new = (float)wc; 并在计算中使用wc_new。如果它有效,我会把它写成答案

标签: c function types division cs50


【解决方案1】:

问题:

wc = (float)wc;
lc = (float)lc;
sc = (float)sc;

所有这些语句都不像你想的那样,因为这些变量的类型原本是int

您正在将int 转换为float 并将其分配回int

解决方案:

将值传递给 float 而不是 int 给函数,隐式转换将处理其余部分。

将您的函数签名更改为

double grade(float lc, float wc, float sc)

【讨论】:

    【解决方案2】:

    或者只是这样做(其他操作数不需要转换为float,因为如果只有一个操作数就足够了,那么其他操作数将被隐式转换为它)

    double grade(int lc, int wc, int sc)
    {
        float L = round(((float)wc/100)/lc);
        float S = round(((float)wc/100)/sc);
        float index = 0.0588 * L - 0.296 * S - 15.8;
        return index;
    }
    

    请注意,返回类型是double,但您只使用floats。在函数中使用double 而不是floats 作为类型,或者将返回类型更改为float

    错误是这个wc = (float)wc;本质上就是这个wc = (int)(float)wc;,因为wc类型是int。基本上什么都没有发生,因此当您像wc/100 一样进行计算时,这将是整数除法,因此如果wc 小于 100(并且 >= 0),则结果为 0 而不是实数,如你所料。

    【讨论】:

      【解决方案3】:
      • wc = (float)wc;int 转换为float,再转换回int,然后赋值。这里没有真正的好处。

      • wc/100 是整数除法,它会丢弃商的小数。不太可能是 OP 想要的。

      • int 转换为float 可能会导致精度降低,从而导致精度降低。 double 更适合广泛的 int 值。

      • 代码混合使用 floatdouble 与调用 double round(double)double 乘法和从 floatdoublefloatdouble 的转换。简化并在整个过程中使用double


      double grade(int lc, int wc, int sc) {
          //               v------v `double` division 
          double L = round(wc/100.0/lc);
          double S = round(wc/100.0/sc);
          return 0.0588 * L - 0.296 * S - 15.8;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-03
        相关资源
        最近更新 更多