【问题标题】:Weird rounding in C [duplicate]C中的奇怪舍入[重复]
【发布时间】:2012-06-21 10:43:24
【问题描述】:

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

【问题讨论】:

    标签: c double precision rounding


    【解决方案1】:

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

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

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

    因为我们除以3.0 而不是3

    即,如果整数除法中的至少一个两个操作数是浮点类型,则结果将是浮点数。 (请注意,关于ints 和截断,我在这里使用浮点/双精度有点互换)

    除了将..0 附加到值(.0 将生成double,而.0f 将生成float - 正如@Morwenn 下面的有用评论所指出的那样),我们也可以显式地将整数转换为浮点数,但重要的是何时我们这样做。一个简单的例子(请注意,在任何情况下,由于vfloat,所以在此示例中的赋值之后之后的值最终为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借来的

    【讨论】:

    • 只是一个小细节,但.0 将生成一个double.0f 将生成一个float
    • @Morwenn .. 这是一个好点。我想我说的是更笼统的术语,我的意思是包括双打/浮动,但我会做一个笔记以确保不会给任何人造成任何混淆。谢谢。
    【解决方案2】:

    虽然您将sum 声明为float,但运算的右侧仅包含整数,因此它被视为整数表达式,并且除法被截断。试试

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

    改为。

    【讨论】:

      猜你喜欢
      • 2014-12-26
      • 1970-01-01
      • 2018-07-28
      • 1970-01-01
      • 2012-03-14
      • 2019-03-27
      • 2013-07-16
      • 1970-01-01
      • 2013-10-21
      相关资源
      最近更新 更多