33

谁能解释为什么当我将它除以一个整数时,为什么 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

4

7 回答 7

44

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

#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;
}
于 2013-04-25T18:17:16.497 回答
18

使用类型转换

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 是浮点数,而不是整数。因此,除法的结果将是浮点数,而不是整数。

于 2013-04-25T18:14:54.910 回答
2

“a”是一个整数,当除以整数时,它会给你一个整数。然后将它作为整数分配给“b”并成为浮点数。

你应该这样做

b = a / 350.0;
于 2013-04-25T18:17:53.457 回答
2

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

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

于 2013-04-25T19:20:13.773 回答
2

章节和诗句

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;应该给你你想要的结果。

于 2013-04-25T19:28:10.640 回答
0

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

于 2013-04-25T18:14:51.300 回答
0

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

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

于 2013-04-25T18:22:57.787 回答