可能重复:
C编程部门
在下面的代码示例中,结果应该产生 130.0,但一旦编译,我得到 129.0。右侧是否没有产生足够的精度来获得准确的结果?有没有解决的办法?
#include<stdio.h>
int main(void) {
double sum = ((117+130)/3) + ((130+13)/3);
printf("sum: %f\n", sum);
}
您正在观察的是 整数截断的结果。当用两个整数操作数进行整数除法时,结果将是另一个整数,小数部分被丢弃。请注意,这与舍入不同,例如,截断 3.8 将变为 3。
这将为您提供预期的输出:
double sum = ((117+130) / 3.0) + ((130+13) / 3.0);
因为我们除以3.0
而不是3
.
即,如果整数除法中的至少一个或两个操作数是浮点类型,则结果将是浮点数。int
(请注意,关于s 和截断,我在这里使用 float/double 有点互换)
除了将 a.
或附加.0
到值之外(.0
将生成 a double
,而.0f
将生成 a float
- 正如下面@Morwenn 的有用评论所指出的那样),我们还可以显式地将 int 转换为浮点数,但是当我们这样做时很重要。一个简单的示例(请注意,在任何情况下,在此示例中的赋值float
之后v
的值都是 a 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. */
我从除法和浮点中借用了上面的例子
尽管您声明sum
为float
,但操作的右侧仅包含整数,因此它被视为整数表达式,并且除法被截断。尝试
double sum = ((117 + 130) / 3.0) + ((130 + 13) / 3.0);
反而。