2

我有一个像“2.1648797E -05”这样的字符串,我需要对其进行格式化以转换“0.00021648797”

有什么解决方案可以进行这种转换

4

5 回答 5

2

尝试使用doublelong long

cout << setiosflags(ios::fixed) << thefloat << endl;

浮点的一个重要特征是它们没有与所有有效数字相关联的精度,返回到大值的小数点。“科学”的展示合理地反映了内在的存储现实。

于 2013-07-09T11:26:26.223 回答
0

C++您可以使用std::stringstream首先打印数字,然后将其读取为双精度,然后使用格式说明符将其打印以将数字的准确性设置为 12 位。看看这个问题,了解如何以固定精度打印十进制数。

于 2013-07-09T11:24:16.933 回答
0

如果您真的只是从字符串表示到字符串表示并且精度非常重要,或者值可能会离开双精度的有效范围,那么我会避免转换为双精度。由于精度错误或范围问题,您的值可能会因此而改变。

尝试编写一个简单的文本解析器。大概是这样:读取数字,省略小数点到“E”,但存储小数点位置。在“E”之后,将指数读取为数字并将其添加到您存储的小数位。然后再次输出数字,在开头或结尾正确附加零并插入小数点。

于 2013-07-09T11:46:27.560 回答
-1

谢谢大家,我使用以下方法修复它:

Decimal dec = Decimal.Parse(str, System.Globalization.NumberStyles.Any);
于 2013-07-09T13:40:10.807 回答
-1

这里有不清楚的问题
1.“2.1648797E -05”中的空格是故意的,我们假设它是可以的。
2. 2.1648797E-05 比 0.00021648797 小 10 倍。假设 OP 的意思是“0.000021648797”(另一个零)。
3. Windows 未标记,但 OP 发布了 Windows 答案。

这里的主要挑战,我认为是 OP 的核心问题是在vs中std::precision()具有不同的含义,而OP 想要在. fixeddefaultdefaultfixed

精度字段与fixed默认浮点表示法不同。默认情况下,precision 字段指定在小数点前后显示的最大有用位数,可能使用科学计数法,而在 中fixed,precision 字段准确指定要在小数点后显示的位数。


解决此问题的 2 种方法:将输入字符串更改为数字,然后以新的固定空格格式输出数字 - 如下所示。第二种方法是解析输入字符串并形成新格式 - 这里没有做。

#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
#include <cmath>
#include <cfloat>

double ConvertStringWithSpaceToDouble(std::string s) {
  // Get rid of pesky space in "2.1648797E -05"
  s.erase (std::remove (s.begin(), s.end(), ' '), s.end());
  std::istringstream i(s);
  double x;
  if (!(i >> x)) {
    x = 0; // handle error;
  }
  std::cout << x << std::endl;
  return x;
}

std::string ConvertDoubleToString(double x) {
  std::ostringstream s;
  double fraction = fabs(modf(x, &x));
  s.precision(0);
  s.setf(std::ios::fixed);
  // stream whole number part
  s << x << '.';
  // Threshold becomes non-zero once a non-zero digit found.
  // Its level increases with each additional digit streamed to prevent excess trailing zeros.
  double threshold = 0.0;
  while (fraction > threshold) {
    double digit;
    fraction = modf(fraction*10, &digit);
    s << digit;
    if (threshold) {
      threshold *= 10.0;
    }
    else if (digit > 0) {
      // Use DBL_DIG to define number of interesting digits
      threshold = pow(10, -DBL_DIG);
    }
  }
  return s.str();
}

int main(int argc, char* argv[]){
  std::string s("2.1648797E -05");
  double x = ConvertStringWithSpaceToDouble(s);
  s = ConvertDoubleToString(x);
  std::cout << s << std::endl;
  return 0;
  }
于 2013-07-09T14:28:48.020 回答