将字符串格式化为科学记数法

时间:2009-12-29 19:31:16

标签: c++ math string

我有一个看起来像这样的字符串:

"0.4794255386042030002732879352156"

大约是罪(0.5)。我想格式化字符串看起来更好

"4.794255386042e-1"

我怎样才能做到这一点?记住我正在处理字符串而不是数字(浮点数,双精度数)。另外,我需要进行舍入以保持数字尽可能准确,我不能只是截断。如果我需要转换为不同的数据类型,我宁愿选择long double,因为常规double没有足够的精度。四舍五入之前,我想要至少12位小数。也许我可以做一个简单的sprintf()转换。

9 个答案:

答案 0 :(得分:9)

这样的事情:

#include<iostream>
using namespace std;

int main()
{
        char *s = "0.4794255386042030002732879352156";
        double d;

        sscanf(s,"%lf",&d);
        printf("%.12e\n",d);

        return EXIT_SUCCESS;
}

输出:

# g++ a.cpp  && ./a.out
4.794255386042e-01

答案 1 :(得分:6)

您是否在寻找this之类的内容?

以下是一个示例:

 // modify basefield
#include <iostream>
#include <sstream>

using namespace std;

int main () {
    std::string numbers("0.4794255386042030002732879352156");
    std::stringstream stream;
    stream << numbers;
    double number_fmt;
    stream >> number_fmt;
    cout.precision(30);

    cout << number_fmt << endl;

    cout.precision(5);
    cout << scientific << number_fmt << endl;
  return 0;
}

输出:

0.479425538604203005377257795772

4.79426e-01

答案 2 :(得分:3)

在高度可移植的C中,下面的工作示例输出:

result is 4.794255386042E-01


#include <stdio.h>

int main()
{
    char *str = "0.4794255386042030002732879352156";

    double f;
    char   newstr [50];
    // convert string in `str` to float
    sscanf (str, "%le", &f);

    sprintf (newstr, "%.12E", f);
    printf ("result is %s\n", newstr);
    return 0;
}

答案 3 :(得分:3)

查看问题中的字符串,看起来您使用的是基数为10的对数。在这种情况下,通过直接扫描字符串来计算前导零或尾随零并将其放入指数中是不是相对容易?

也许我错过了什么......

答案 4 :(得分:2)

使用sscanf()转换为long double,然后使用sprintf()将其作为字符串打印出来,使用科学格式化程序:

long double x;
char num[64];

if(sscanf(string, "%Lf", &x) == 1)
  sprintf(num, "%.12Le", x);

不确定即使long double实际上是否为您提供了12位有效数字。在我的系统上,这会生成"4.79425538604e-01"

答案 5 :(得分:2)

IEEE 754 64位浮点数(即双精度)适用于15位十进制有效数字,因此转换为double时应该没有问题。您更有可能遇到使格式说明符显示所有可用数字的问题。虽然从发布的例子来看,情况似乎并非如此。

答案 6 :(得分:0)

C或C ++中没有标准功能来执行此操作。通常的方法是转换为数字(然后使用标准函数格式化数字)或编写自己的自定义输出函数。

答案 7 :(得分:0)

#include <iostream>
using namespace std;
...
double dd = strtod( str );
cout << scientific << dd << endl;

答案 8 :(得分:0)

根据您想要的小数位数(在本例中为12),您可以执行以下操作:

int main() { 
  char buff[500];
  string x = "0.4794255386042030002732879352156";
  double f = atof(x.c_str());
  sprintf(buff,"%.12fe-1",f*10);
  cout<<buff<<endl;
  return 0;
}

结果: ----------捕获输出----------

  

“c:\ windows \ system32 \ cmd.exe”/ c c:\ temp \ temp.exe   4.794255386042e-1   以退出代码0终止。