3

我是一个编程新手。我需要一个简单的函数来将任何带小数点 X.YZ 的数字转换为 XYZ。我通过将它乘以 10 次并使用doubleint转换来做到这一点。


  int main()
  {
    std::cout << "Number: " << std::endl;
    double a;
    // the uninitialized b was pointed out, its not the issue
    long b = 0;

    std::cin >> a;

       while(b!=a)
             {
              a*=10;
              b=a;
             }

    std::cout << a << std::endl;
    return 0;
  }

这在 90% 的情况下都有效。对于像 132.54 这样的数字,程序运行的时间是无限长的。它以应有的方式处理 132.547(应该使用比 132.54 更多的内存)。

所以我的问题是:为什么对于 long int 的内存范围内的数字不能 100% 工作?为什么是 132.54 和类似的数字?

我正在使用代码块和 GNU GCC 编译器。

4

5 回答 5

4

许多十进制浮点数不能用二进制精确表示。你只能得到一个接近的近似值。

如果 132.54 表示为 132.539999999999999,您将永远找不到匹配项。

打印循环中的值,您将看到会发生什么。

于 2012-09-25T11:44:26.003 回答
2

您的问题是您从未初始化b,因此具有未定义的行为

你应该做这个:

 long b = 0;

现在您可以将 b 与其他东西进行比较并获得良好的行为。

还应将 afloatintegral类型进行比较,就像与适当的 epsilon 值进行比较一样:

 while(fabs(an_int - a_float) < eps) 
于 2012-09-25T11:34:35.493 回答
2

问题是大多数十进制值不能完全表示为浮点值。因此,只有几个数字的十进制值并不能保证乘以足够多的十倍会产生一个没有小数部分的浮点值。要看到这一点,a通过循环显示每次的值。低位有很多噪音。

于 2012-09-25T11:44:54.980 回答
1

与其将其读取为双精度,不如将其读取为字符串并解析它。这样你就不会遇到浮动精度问题。

于 2012-09-25T12:02:14.210 回答
0
long b;

在这里你定义 b. 从这一点来看,变量包含垃圾值。该值可以是绝对随机的,基本上它只是分配时内存中发生的事情。之后,您在以下条件下使用此变量:

 while(b!=a)

这将导致未定义的行为,这基本上意味着任何事情都可能发生,包括应用程序似乎正在运行的机会(如果你幸运的话),基于b.

为避免这种情况,您需要b使用一些值来初始化 ,例如long b = 0.

于 2012-09-25T11:39:10.420 回答