奇怪的四舍五入

时间:2012-06-21 10:43:25

标签: c double precision rounding

  

可能重复:
  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);
}

2 个答案:

答案 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之外分配后,之后的值最终为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. */

我从Division and floating points

借用了上述例子

答案 1 :(得分:4)

虽然您将sum声明为float,但操作的右侧包含ONLY整数,因此它被视为整数表达式,并且分割被截断。尝试

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

代替。