C 为什么除两个整数不';你没有浮球吗?

C 为什么除两个整数不';你没有浮球吗?,c,C,有人能解释为什么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 } #包括 void main(){ INTA

有人能解释为什么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
}
#包括
void main(){
INTA;
浮球b、c、d;
a=750;
b=a/350;
c=750;
d=c/350;
printf(“%.2f%.2f”,b,d);
//产出:2.00 2.14
}

最好的原因可能是因为
0xfffffffffffffffff/15
会给你一个非常错误的答案…

类型的使用:

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、c、d
属于
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;
}
#包括
int main(){
INTA;
浮球b、c、d;
a=750;
b=a/350.0f;
c=750;
d=c/350;
printf(“%.2f%.2f”,b,d);
//产出:2.14 2.14
返回0;
}
“a”是一个整数,当与整数相除时,它将给出一个整数。然后将其作为整数分配给“b”,并成为浮点

你应该这样做

b = a / 350.0;

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


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

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

编辑:我的回答让我想起一个经典的老人说:“当我像你这么大的时候……”

6.5.5乘法运算符

6当整数被除时,
/
运算符的结果是具有任意值的代数商 如果商
a/b
是可表示的,则表达式
(a/b)*b+a%b
应等于
a
;否则,
a/b
a%b
的行为都是 未定义。

105)这通常称为“向零截断”。
将整数除以整数得到整数结果。1/2的产量为0;将此结果赋给浮点变量将得到0.0。要获得浮点结果,至少一个操作数必须是浮点类型<代码>b=a/350.0f应提供您想要的结果

“为什么?”-因为语言就是这样设计的。如果你想要一个
浮点数
,你可以先将其转换为
浮点数
。仅仅因为赋值的左侧是浮点数并不意味着右侧必须是浮点数——它只意味着右侧必须提供与浮点数相等或更低的精度,因此,编译器没有理由将其设置为int以外的任何形式。因为
a
350
都是
int
s。因为这是Kernighan和Ritchie定义它的方式。@ValekHalfHeart“精度等于或小于”与此无关<代码>整数i=2.0
双d=1都是有效的。这会产生相同的结果吗<代码>b=(浮动)a/350是的,会的。您需要将任何一个输入到
float
。实际上,
350.0
是一个
double
,操作的结果将是一个
double
,然后转换为
float
,用于分配
350.0f
将是一个
float
@danielfisher感谢您的澄清。double和float的区别到底是什么?@jon类型的范围和精度。它们可能相等,但通常情况下,
float
是一种精度为24位的32位类型,它可以存储的最大有限数为3.4028235e38,最小正数为1.0e-45,而
double
是一种64位类型,具有53位精度,能够存储高达1.7976931348623157e308、小至5.0e-324的数字。结果不会转换为浮点。强制转换是程序员执行的显式操作。结果从
int
隐式转换为
float
。术语很重要,谢谢。我将在这里编辑它,并在将来处理它。:)对真不敢相信我错过了。我只是简单地复制了OP的代码,并修复了
float
行。我现在就来解决这个问题。:)哦酷。这对我来说是新知识。我以后会记得的。事实上,我也会编辑这篇文章,这样,如果有人再次看到这篇文章,他们就会知道其中的区别。:)@Sukritkalla这里有一个测验,其中的
f
后缀起了作用:为什么要投反对票?整数除法给出精确结果的期望可能是除法不应隐式“提升”为浮点类型的最佳理由。(顺便说一句,这是Lua对数字的处理非常糟糕的原因之一。)这个问题可以解释为“为什么
int/int
不作为浮点计算,因为我立即将它分配给浮点变量?”。你的回答虽然很有见地,但并没有解决OP的误解。除此之外,可能它被否决了,因为它太简洁了。我思考了五分钟,得出的结论是,这本书很有趣和/或很有见地,原因不在于o