【问题标题】:Precision when converting a string decimal number转换字符串十进制数时的精度
【发布时间】:2023-04-01 03:03:01
【问题描述】:

我需要一种方法来将此字符串转换为其确切的数字表示形式。我已经尝试了很多事情,据我所知,这应该有效(著名的遗言)。我试图远离安装库,我有很多这些数字要转换。

我知道用二进制表示长十进制数字很困难,但我需要一个解决方案。

#include <iostream>
#include <stdlib.h>

using namespace std;

int main()
{
   string data = "138.6470184568";
   cout << atof(data.c_str()) << endl;

   return 0;
}

输出

138.647

【问题讨论】:

  • 转换后你打算如何处理它们?你在使用 GCC 吗?看起来它在不需要库的情况下内置了某种十进制支持 - stackoverflow.com/questions/14096026/…
  • 该值是否可以精确存储为二进制不取决于十进制的长度,而是它是否可以用二进分数表示。例如 0.1 虽然很短,但不能用二进制正确表示,但 0.000244140625 可以
  • 并且不要使用atofatoi。这是不安全的。请改用strtod,因为它提供错误检查
  • 要更精确地打印出值,请使用this way

标签: c++ string type-conversion floating-point-precision atof


【解决方案1】:

结果证明它转换正确,但是当被要求计算数字时,它只给出 3-4 位小数。有人知道为什么吗?

#include <iostream>
#include <stdlib.h>
#include <iomanip>

using namespace std;

int main()
{
   string data1 = "138.6470184568";
   string data2 = "138.6470184568";
   double data3 = atof(data1.c_str()) + atof(data2.c_str());

   cout << data3 << endl;
   cout << setprecision(15) << data3;

   return 0;
}

给予

277.294
277.2940369136

【讨论】:

  • 如果您想回答您在此处提出的问题,能否创建一个新问题?
  • 这如何回答您的问题? default precision is 6 digits 以及 277.294 和 138.647 都有 6 个有效数字
  • 你是对的,但我需要用更精确的数字进行算术运算。我上面的回答证明,虽然默认情况下它只会计算出 6 位数字,但它会存储(并因此进行算术运算)我传入的整个数字。
猜你喜欢
  • 2012-06-18
  • 1970-01-01
  • 2015-06-14
  • 2014-05-05
  • 2012-09-25
  • 1970-01-01
  • 2019-08-13
  • 2019-08-31
  • 1970-01-01
相关资源
最近更新 更多