【问题标题】:Why dividing two integers doesn't get a float? [duplicate]为什么除以两个整数不会得到浮点数? [复制]
【发布时间】:2013-04-25 18:12:22
【问题描述】:

谁能解释为什么当我将 b 除以一个整数时,它会被四舍五入,尽管它是一个浮点数?

#include <stdio.h>

void main() {
    int a;
    float b, c, d;
    a = 750;
    b = a / 350;
    c = 750;
    d = c / 350;
    printf("%.2f %.2f", b, d);
    // output: 2.00 2.14
}

http://codepad.org/j1pckw0y

【问题讨论】:

  • “为什么?” - 因为语言是这样设计的。如果您想要 float,请先转换为 float
  • 仅仅因为赋值的左侧是浮点数并不意味着右侧必须是 - 它仅意味着右侧必须提供 equal或低于浮点数的精度,因此编译器没有理由将其设为除 int 以外的任何值。
  • 因为a350ints。
  • 因为这是 Kernighan 和 Ritchie 定义它的方式。
  • @ValekHalfHeart “精度相同或更低”与此无关。无论您对“精度”的定义是什么,int i = 2.0;double d = 1; 都是有效的。

标签: c


【解决方案1】:

这是因为隐式转换。变量b, c, dfloat 类型。但是/ 运算符看到它必须除以的两个整数,因此在结果中返回一个整数,该整数通过添加小数点隐式转换为float。如果您想要浮点除法,请尝试将两个操作数设为 / 浮点数。如下。

#include <stdio.h>

int main() {
    int a;
    float b, c, d;
    a = 750;
    b = a / 350.0f;
    c = 750;
    d = c / 350;
    printf("%.2f %.2f", b, d);
    // output: 2.14 2.14
    return 0;
}

【讨论】:

    【解决方案2】:

    使用casting的类型:

    int main() {
        int a;
        float b, c, d;
        a = 750;
        b = a / (float)350;
        c = 750;
        d = c / (float)350;
        printf("%.2f %.2f", b, d);
        // output: 2.14 2.14
    }
    

    这是解决该问题的另一种方法:

     int main() {
            int a;
            float b, c, d;
            a = 750;
            b = a / 350.0; //if you use 'a / 350' here, 
                           //then it is a division of integers, 
                           //so the result will be an integer
            c = 750;
            d = c / 350;
            printf("%.2f %.2f", b, d);
            // output: 2.14 2.14
        }
    

    但是,在这两种情况下,您都在告诉编译器 350 是浮点数,而不是整数。因此,除法的结果将是浮点数,而不是整数。

    【讨论】:

    • 这会产生相同的结果吗? b = (float) a / 350;
    • 是的,会的。您需要将任何一个类型转换为float
    • 实际上,350.0 是一个double,操作的结果将是一个double,然后将其转换为float 进行分配。 350.0f 将是 float
    • @DanielFischer 感谢您的澄清。 double 和 float 之间究竟有什么区别?
    • @jon 类型的范围和精度。它们可能相等,但通常,float 是 32 位类型,精度为 24 位,它可以存储的最大有限数是 3.4028235e38,最小的正数是 1.0e-45 , 而double 是一种 64 位类型,具有 53 位精度,能够存储高达 1.7976931348623157e308 和小至 5.0e-324 的数字。
    【解决方案3】:

    "a" 是一个整数,当除以整数时,它会得到一个整数。然后将它作为一个整数赋值给“b”,变成一个浮点数。

    你应该这样做

    b = a / 350.0;
    

    【讨论】:

      【解决方案4】:

      具体来说,这不是对您的结果进行四舍五入,而是向零截断。所以如果你除以-3/2,你会得到-1而不是-2。欢迎来到积分数学!在 CPU 可以进行浮点运算或数学协处理器出现之前,我们用积分数学来完成所有事情。尽管有用于浮点数学的库,但它们对于一般用途而言过于昂贵(在 CPU 指令中),因此我们对数字的整个部分使用 16 位值,而对小数部分使用另一个 16 位值。

      编辑:我的回答让我想起了经典的老人说“当我像你这个年纪......”

      【讨论】:

        【解决方案5】:

        Chapter and verse

        6.5.5 乘法运算符
        ...
        6 整数相除时,/ 运算符的结果是与任意整数的代数商 小数部分被丢弃。105) 如果商 a/b 是可表示的,则表达式 (a/b)*b + a%b 应等于 a;否则,a/ba%b 的行为是 未定义。

        105) 这通常被称为“向零截断”。

        整数除以整数得到整数结果。 1/2 产生 0;将此结果分配给浮点变量会得到 0.0。要获得浮点结果,至少有一个操作数必须是浮点类型。 b = a / 350.0f; 应该会给你想要的结果。

        【讨论】:

          【解决方案6】:

          可能最好的原因是因为0xfffffffffffffff/15 会给你一个可怕的错误答案...

          【讨论】:

          • 为什么投反对票?整数除法给出精确结果的期望可能是除法不应隐式“提升”为浮点类型的最佳原因。 (顺便说一句,这也是 Lua 对数字的处理方式很糟糕的原因之一。)
          • 问题可以解释为“为什么int/int不评估为浮点数因为我立即将它分配给浮点变量?” .您的回答虽然很有见地,但并未解决 可能 实际上是 OP 的误解。除此之外,也许它被否决了,因为它太简洁了。我思考了五分钟,得出的结论是,它很有趣和/或很有见地,而不是你最终给出的原因。
          【解决方案7】:

          两个整数相除将得到一个整数(整数)的结果。

          您需要将一个数字转换为浮点数,或为其中一个数字添加小数,例如 a/350.0。

          【讨论】:

            猜你喜欢
            • 2021-05-14
            • 1970-01-01
            • 1970-01-01
            • 2013-05-31
            • 2014-09-29
            • 1970-01-01
            • 1970-01-01
            • 2011-04-16
            • 2011-03-03
            相关资源
            最近更新 更多