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

rat*_*tty 23 c

double a;
a = 3669.0;
int b;
b = a;
Run Code Online (Sandbox Code Playgroud)

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

我该如何解决这个问题?如果有这样的3559.8我也想要像3559而不是3560.

Jon*_*eet 51

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

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
Run Code Online (Sandbox Code Playgroud)

是什么让我说的是,尽管许多十进制值不能准确地存储在float或中double,但这并不适用于这种大小的整数.它们可以很容易地以二进制浮点形式精确表示.(非常大的整数不能总是精确表示,但我们在这里不处理一个非常大的整数.)

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

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

3668.99999999999954525264911353588104248046875
Run Code Online (Sandbox Code Playgroud)

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

  • 这就是答案.那是一个很好的答案!我的问题:当@Jon Skeet的分数对SO来说太大时会发生什么?我们对Jon Skeet的欣赏最终会杀死SO吗? (3认同)

Jee*_*tel 5

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

}
Run Code Online (Sandbox Code Playgroud)

输出是:b is 3669

当你写b = a时;然后将其自动转换为int

see on-line compiler result : 
Run Code Online (Sandbox Code Playgroud)

http://ideone.com/60T5b


Sha*_*fiz 3

这就是臭名昭著的浮点舍入问题。只需添加一个非常小的数字即可纠正问题。

double a;
a=3669.0;
int b;
b=a+ 1e-9;
Run Code Online (Sandbox Code Playgroud)

  • 这里应该没有问题,因为 3669.0 可以完全用二进制浮点数表示。 (9认同)
  • 在我看来,后者“更有可能”是这种情况。 (5认同)