如何在C中将double转换为int?

时间:2011-10-05 06:11:03

标签: c

double a;
a = 3669.0;
int b;
b = a;

我在b中得到3668,而不是3669。

如何解决此问题?  如果有3559.8这样我也想要3559而不是3560。

4 个答案:

答案 0 :(得分:47)

我怀疑你实际没有那个问题 - 我怀疑你真的得到了:

double a = callSomeFunction();
// Examine a in the debugger or via logging, and decide it's 3669.0

// Now cast
int b = (int) a;
// Now a is 3668

是什么让我说的是,尽管许多十进制值不能完全存储在floatdouble中,但这不适用于此的整数那种程度。它们可以很容易地以二进制浮点形式精确表示。 (非常大的整数不能总是精确表示,但我们在这里不处理一个非常大的整数。)

我强烈怀疑您的double实际略低于3669.0,但是您正在使用的任何诊断设备显示为3669.0。转换为整数值只执行截断,而不是舍入 - 因此问题。

假设您的double类型是IEEE-754 64位类型,则小于3669.0的最大值恰好是

3668.99999999999954525264911353588104248046875

因此,如果您正在使用任何诊断方法,其值将显示为3669.0,那么很可能(可能,我会说)这就是正在发生的事情。

答案 1 :(得分:4)

main() {
    double a;
    a=3669.0;
    int b;
    b=a;
    printf("b is %d",b);

}

输出为:b is 3669

当你写b = a;然后它自动转换为int

see on-line compiler result : 

http://ideone.com/60T5b

答案 2 :(得分:2)

这是臭名昭着的浮点舍入问题。只需添加一个非常小的数字即可解决问题。

double a;
a=3669.0;
int b;
b=a+ 1e-9;

答案 3 :(得分:0)

int b;
double a;
a=3669.0;
b=a;
printf("b=%d",b);

此代码将输出显示为b = 3669,只有您清楚地检查它。