可能重复:
C programming division
在下面的代码示例中,结果应该产生130.0但是一旦编译,我得到129.0。右侧是否没有产生足够的精度来获得准确的结果?有办法解决这个问题吗?
#include<stdio.h>
int main(void) {
double sum = ((117+130)/3) + ((130+13)/3);
printf("sum: %f\n", sum);
}
答案 0 :(得分:7)
您观察的是整数截断的结果。当使用两个整数操作数进行整数除法时,结果将是另一个整数,其中小数部分被丢弃。请注意,这与舍入不同,例如,截断3.8将变为3。
这将为您提供预期的输出:
double sum = ((117+130) / 3.0) + ((130+13) / 3.0);
因为我们除以3.0
而不是3
。
即,如果整数除法中的操作数的一个或两个都是浮点类型,则结果将是浮点数。 (请注意,我在这里使用float / double在int
和截断方面有些可互换)
除了将.
或.0
附加到值(.0
将生成double
,而.0f
将生成float
- 正如@ Morwenn在下面提到的有用评论所指出的那样,我们也可以明确地将浮动内容强加给浮点数,但是当我们这样做时很重要。一个简单的示例(请注意,在此示例中,除了float
v
之外分配后,1}} 之后的值最终为float
:
float v = 0;
/* values shown are BEFORE assignment */
v = (5 / 2); /* value is 2 due to integer truncation before assignment */
v = (float) (5 / 2); /* 2.0 as integer division occurs 1st, then cast to float */
v = (float) 5 / 2; /* 2.5 since 5 becomes 5.0 through casting first. */
借用了上述例子
答案 1 :(得分:4)
虽然您将sum
声明为float
,但操作的右侧包含ONLY整数,因此它被视为整数表达式,并且分割被截断。尝试
double sum = ((117 + 130) / 3.0) + ((130 + 13) / 3.0);
代替。