将double转换为int而不舍入

时间:2019-01-16 14:21:24

标签: c

我不明白为什么在逗号四舍五入后尝试将double转换为int值。

void print_float(double nb)
{
    int negative;
    int intpart;
    double decpart = -10.754;
    int v;

    negative = (nb < 0.0f);
    intpart = (int)nb;
    decpart = nb - intpart;
    v = (int)(decpart * 1000);

    if (negative) {
        v *= -1;
    }

    printf("%i.%i", intpart, v); // output: -10.753
}

我以为后顾之忧来自猜测,但我不明白问题所在。

1 个答案:

答案 0 :(得分:6)

double无法完全编码所有数字。它可以精确编码大约2 64 个不同的值。 -10.754不是其中之一。取而代之的是,附近使用的值比预期的少。

printf("%.24f", -10.754);
// -10.753999999999999559463504

decpart * 1000部分引入了一些不精确性,但乘积仍低于754.0,然后(int)强制转换为753。