3

可能重复:
C编程部门

在下面的代码示例中,结果应该产生 130.0,但一旦编译,我得到 129.0。右侧是否没有产生足够的精度来获得准确的结果?有没有解决的办法?

#include<stdio.h>
int main(void) {
    double sum = ((117+130)/3) + ((130+13)/3);
    printf("sum: %f\n", sum);
}
4

2 回答 2

7

您正在观察的是 整数截断的结果。当用两个整数操作数进行整数除法时,结果将是另一个整数,小数部分被丢弃。请注意,这与舍入不同,例如,截断 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. */

我从除法和浮点中借用了上面的例子

于 2012-06-21T10:46:04.893 回答
4

尽管您声明sumfloat,但操作的右侧仅包含整数,因此它被视为整数表达式,并且除法被截断。尝试

double sum = ((117 + 130) / 3.0) + ((130 + 13) / 3.0);

反而。

于 2012-06-21T10:45:57.417 回答