我知道当数字不是很大时解决这个问题有很多问题,但是当涉及到大数字时(仍处于浮点数/双数范围内),输出将失去精度:
#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
但这显然不正确!如何进行真正的转换?!
答案 0 :(得分:0)
问题是双精度浮点数用IEEE-754二进制格式用64位表示,其精度约为16位十进制数。因此,您看到的整数值是IEE-754格式中最接近1e307
(resp。-1e307
)的整数值。
如果您知道自己需要其他代表,则必须自己构建手动。最简单的方法(恕我直言)将使用默认格式在stringstream
上输出它,然后解析它:
e
,指数在后面,之前是格式1.234中的尾数...即小数点前的一位数,只需根据指数移动小数点,添加为在数字(负指数)之前或之后(正数)e
,则输出已经是固定格式或者,您可以尝试找到一个大十进制库,它将在内部使用十进制数字的精确表示(或者如果您找不到符合要求的话,请自行编写)。
答案 1 :(得分:0)