奇怪的四舍五入

ill*_*umi 3 c precision double rounding

可能重复:
C编程部门

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

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

Lev*_*von 7

您观察的是整数截断的结果 .当使用两个整数操作数进行整数除法时,结果将是另一个整数,其中小数部分被丢弃.请注意,这与舍入不同,例如,截断3.8将变为3.

这将为您提供预期的输出:

double sum = ((117+130) / 3.0) + ((130+13) / 3.0);
Run Code Online (Sandbox Code Playgroud)

因为我们除以3.0而不是3.

即,如果整数除法中的至少一个两个操作数都是浮点类型,则结果将是浮点数.(注意我在这里使用float/double在ints和截断方面有些可互换)

除了附加一个..0一个值(.0将生成一个double,同时.0f将生成一个float- 正如@ Morwenn在下面的有用评论所指出的那样),我们也可以明确地将整数转换为浮点数,但是我们这样做时它很重要.一个简单的例子(注意,在这个例子中赋值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. */
Run Code Online (Sandbox Code Playgroud)

我从Division和浮点借用了上面的例子