【问题标题】:Why does this double to int conversion not work?为什么这种 double 到 int 的转换不起作用?
【发布时间】:2011-05-02 01:42:15
【问题描述】:

我一直在彻底寻找为什么会发生这种情况的正确解释,但仍然不太明白,所以如果这是重新发布,我深表歉意。

#include <iostream>
int main()
{
    double x = 4.10;
    double j = x * 100;

    int k = (int) j;

    std::cout << k;
 }

 Output: 409

我似乎无法用任何其他号码复制此行为。也就是说,将 4.10 替换为该形式中的任何其他数字,输出是正确的。

一定有某种我不理解的低级转换的东西。

谢谢!

【问题讨论】:

标签: c++ type-conversion


【解决方案1】:

4.1 不能用double 精确表示,它可以用更小的东西来近似:

double x = 4.10;
printf("%.16f\n", x);  // Displays 4.0999999999999996

所以j 会比 410 稍微小一点(即 409.99...)。转换为 int 会丢弃小数部分,因此得到 409。

(如果您想要另一个表现出类似行为的数字,您可以尝试 8.2、16.4 或 32.8...看到模式了吗?)

必填链接:What Every Computer Scientist Should Know About Floating-Point Arithmetic

【讨论】:

  • 感谢您的解释和很棒的链接。
【解决方案2】:

修复

int k = (int)(j+(j<0?-0.5:0.5));

逻辑

您遇到了数字基数问题。

虽然在屏幕上,4.10 是十进制,但编译后,它会表示为二进制浮点数,而 .10 并不能完全转换为二进制,最终会得到 4.099999....

将 409.999... 转换为 int 只会丢弃数字。如果在转换为 int 之前添加 0.5,它实际上会四舍五入到最接近的数字,即 410(409.49 将转到 409.99,转换为 409)

【讨论】:

  • 我自己使用过这个非常简单的四舍五入公式,但它对负数效果不佳。
  • 谢谢!肯定会用这个。
【解决方案3】:

试试这个。

#include <iostream>
#include "math.h"
int main()
{
double x = 4.10;
double j = x * 100;

int k = (int) j;

std::cout << trunc(k);
std::cout << round(k);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-18
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-03
    • 2012-02-18
    相关资源
    最近更新 更多