Math 将科学记数法中的字符串格式化为十进制字符串

Math 将科学记数法中的字符串格式化为十进制字符串,math,io,c++-cli,Math,Io,C++ Cli,我有一个像“2.1648797E-05”这样的字符串,我需要将其格式化为转换为“0.0002164877” 在C++中,是否有进行此转换的解决方案?您可以使用std::stringstream首先打印数字,然后将其读取为双精度,然后使用格式说明符将数字的精度设置为12位。查看有关如何以固定精度打印十进制数的问题。尝试使用double或long cout << setiosflags(ios::fixed) << thefloat << endl; cout如

我有一个像“2.1648797E-05”这样的字符串,我需要将其格式化为转换为“0.0002164877”


C++
中,是否有进行此转换的解决方案?您可以使用
std::stringstream
首先打印数字,然后将其读取为双精度,然后使用格式说明符将数字的精度设置为12位。查看有关如何以固定精度打印十进制数的问题。

尝试使用
double
long

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

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

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

谢谢各位,我使用以下方法修复它:

Decimal dec = Decimal.Parse(str, System.Globalization.NumberStyles.Any);

这里有一些不明确的问题
1.“2.1648797E-05”中的空格是否有意,让我们假设它是正确的。
2.2.1648797E-05比0.0002164877小10倍。假设OP表示“0.000021648797”(另一个零)。
3.Windows未被标记,但OP发布了Windows答案

这里的主要挑战,我认为是OP的核心问题是
std::precision()
fixed
default
中有不同的含义,OP想要
fixed
中的
default
含义

“精度”字段在“固定”和“默认浮点表示法”之间有所不同。默认情况下,“精度”字段指定小数点前后显示的可用位数的最大值(可能使用科学记数法),而在“固定”中,“精度”字段指定小数点后显示的位数


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

#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;
  }
#包括
#包括
#包括
#包括
#包括
#包括
双ConvertStringWithSpaceToDouble(标准::字符串s){
//摆脱“2.1648797E-05”中令人讨厌的空格
s、 擦除(std::remove(s.begin()、s.end()、“”)、s.end());
std::istringstream i(s);
双x;
如果(!(i>>x)){
x=0;//句柄错误;
}

std::您是否应该显示您迄今为止尝试过的代码,并具体说明它不起作用的原因(例如,编译器错误、输出格式错误等)。这样我们可以看到,例如,您打算使用,
iostreams
进行输出。您尝试过吗?@没有建议他(?)是Windows上的,所以我认为我们应该坚持标准库,除非告诉其他。你喜欢C++中的一个解决方案吗?用十进制。