Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中将double转换为int?_C - Fatal编程技术网

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

如何在C中将double转换为int?,c,C,我的b成绩是3668,而不是3669 如何解决此问题? 如果有3559.8这样的,我也想要3559而不是3560。这就是臭名昭著的浮点舍入问题。只需添加一个非常小的数字,即可更正此问题 double a; a = 3669.0; int b; b = a; 输出为:b为3669 当你写b=a时;然后它会自动转换为int main() { double a; a=3669.0; int b; b=a; printf("b is %d",

我的b成绩是3668,而不是3669

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

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

double a;
a = 3669.0;
int b;
b = a;
输出为:
b为3669

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

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


这称为隐式类型转换 在这里阅读更多内容

我怀疑你实际上没有这个问题-我怀疑你真的有:

see on-line compiler result : 
让我这么说的原因是,尽管许多十进制值确实不能准确地存储在
float
double
中,但这并不适用于这种大小的整数。它们可以很容易地以二进制浮点形式精确表示。(非常大的整数不能总是精确表示,但我们这里不处理非常大的整数。)

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

double a;
a = 3669.0;
int b;
b = a;
假设您的
double
类型是IEEE-754 64位类型,则小于3669.0的最大值正好是

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
因此,如果您使用的是任何诊断方法,其中该值将显示为3669.0,那么很可能(很可能,我会说)发生了这种情况

3668.99999999999954525264911353588104248046875

这段代码给出的输出为b=3669,只有您清楚地检查它。

这很有趣
3669.0
完全可以用浮点表示…@Mysticial:嗯,是的,这个数字应该以浮点格式存储为3669。也许是编译器的问题。3668.51也应该映射到3669吗?(你是在试图取整,还是仅仅是截取非常接近的数字?)。OP有一个复杂的计算,他认为这会导致
3669.0
,但它确实会导致稍微少一些。我运行了这个,在b中得到3669。结果如下[link]这里应该没有问题,因为3669.0完全可以用二进制浮点表示。@JonSkeet:是的,我同意。对于这个特定的数字,问题不应该发生。我猜编译器可能出了问题,或者OP没有给出导致问题的确切情况。在我看来,后者更可能是这种情况。请尝试添加类似于
printf的内容(“a=%.50f\n”,a)
要查看
a
@KeithThompson的实际值,我个人使用C中的一段代码,它直接处理二进制值:)这就是答案。这是一个很好的答案!我的问题是:如果@Jon Skeet的得分太高,那么会发生什么?我们对乔恩·斯基特的感激最终会杀死他吗?“
int
”中的“双倍转换”?噢,是的,在int…对不起,这是我的错误
int b;
double a;
a=3669.0;
b=a;
printf("b=%d",b);