【问题标题】:How to Convert double to int in C?如何在C中将double转换为int?
【发布时间】:2021-02-11 14:01:20
【问题描述】:
double a;
a = 3669.0;
int b;
b = a;

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

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

【问题讨论】:

  • 这很有趣。 3669.0 完全可以用浮点数表示...
  • @Mysticial:嗯,是的,该数字应该以浮点格式存储为 3669。也许是编译器的问题。
  • 3668.51 也应该映射到 3669 吗? (您是要四舍五入,还是只是截取非常接近的数字?)
  • 代码是个谎言。 OP 有一个复杂的计算,他认为会导致 3669.0,但实际上导致的结果略少。
  • 我运行这个并在 b 中得到 3669。这是结果 [链接]ideone.com/yWT5G

标签: c


【解决方案1】:

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

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,那么很有可能(我会说很可能)这是正在发生的事情。

【讨论】:

  • 尝试添加类似printf("a = %.50f\n", a); 的内容以查看a 的实际值。
  • @KeithThompson:就我个人而言,我使用了一些我在 C# 中直接处理二进制值的代码 :)
  • 这就是答案。这是一个很好的答案!我的问题:当@Jon Skeet 的分数对 SO 来说太大时会发生什么?我们对 Jon Skeet 的感激最终会杀死 SO 吗?
【解决方案2】:
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


这称为隐式类型转换 在此处阅读更多信息https://www.geeksforgeeks.org/implicit-type-conversion-in-c-with-examples/

【讨论】:

  • 转换成双倍” in int?
  • 哦,你明白了……对不起,这是我的错误
【解决方案3】:

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

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

【讨论】:

  • 这里应该没有问题,因为 3669.0 完全可以用二进制浮点数表示。
  • @JonSkeet:是的,我同意。对于这个特定的数字,问题不应该发生。我猜编译器可能有问题,或者 OP 没有给出导致问题的确切情况。
  • 后者更有可能是这种情况,IMO。
【解决方案4】:
int b;
double a;
a=3669.0;
b=a;
printf("b=%d",b);

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

【讨论】:

    猜你喜欢
    • 2012-06-01
    • 2021-08-14
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 2016-07-24
    • 2014-01-14
    相关资源
    最近更新 更多