如何将十进制科学记数法float / double转换为普通字符串

时间:2015-10-12 14:38:36

标签: c++ floating-point scientific-notation

我知道当数字不是很大时解决这个问题有很多问题,但是当涉及到大数字时(仍处于浮点数/双数范围内),输出将失去精度:

#include <stdio.h>
#include <iostream>
#include <sstream>

int main() {
    double d = -1e307, d2 = 1e307;
    std::cout << std::fixed << d << std::endl;

    printf("d2 is %lf\n", d2);
    return 0;
}

此代码将输出如下:

-9999999999999999860310597602564577717002641838126363875249660735883565852672743849064846414228960666786379280392654615393353172850252103336275952370615397010730691664689375178569039851073146339641623266071126720011020169553304018596457812688561947201171488461172921822139066929851282122002676667750021070848.000000

d2 is 9999999999999999860310597602564577717002641838126363875249660735883565852672743849064846414228960666786379280392654615393353172850252103336275952370615397010730691664689375178569039851073146339641623266071126720011020169553304018596457812688561947201171488461172921822139066929851282122002676667750021070848.000000

但这显然不正确!如何进行真正的转换?!

2 个答案:

答案 0 :(得分:0)

问题是双精度浮点数用IEEE-754二进制格式用64位表示,其精度约为16位十进制数。因此,您看到的整数值是IEE-754格式中最接近1e307(resp。-1e307)的整数值。

如果您知道自己需要其他代表,则必须自己构建手动。最简单的方法(恕我直言)将使用默认格式在stringstream上输出它,然后解析它:

  • 如果内部有e,指数在后面,之前是格式1.234中的尾数...即小数点前的一位数,只需根据指数移动小数点,添加为在数字(负指数)之前或之后(正数)
  • 需要多少0
  • 如果里面没有e,则输出已经是固定格式

或者,您可以尝试找到一个大十进制库,它将在内部使用十进制数字的精确表示(或者如果您找不到符合要求的话,请自行编写)。

答案 1 :(得分:0)

实际上我处理了这个问题,这是我的代码,该函数将任意浮点字符串转换为普通字符串。

此功能受this question启发。

location.href