可靠地将字符串转换为双精度和反精度 我正在搜索函数,以将字符串可靠地转换成双倍,然后返回到C++中的字符串,这样输出字符串与输入字符串完全相同。但即使经过数小时的搜索和试用,我也找不到可靠的功能

可靠地将字符串转换为双精度和反精度 我正在搜索函数,以将字符串可靠地转换成双倍,然后返回到C++中的字符串,这样输出字符串与输入字符串完全相同。但即使经过数小时的搜索和试用,我也找不到可靠的功能,c++,string,double,string-parsing,C++,String,Double,String Parsing,为了检查功能是否可靠,我进行了以下测试: #include <iostream> #include <string> using namespace std; string double2string(double value){ //... } double string2double(string value){ //... } int main(){ string strings[] = { "11111111111

为了检查功能是否可靠,我进行了以下测试:

#include <iostream>
#include <string>

using namespace std;

string double2string(double value){
    //...
}
double string2double(string value){
    //...
}


int main(){

    string strings[] = {
        "111111111111110000",
        "11111111111111000",
        "1111111111111100",
        "111111111111110",
        "11111111111111",
        "1111111111111.1",
        "111111111111.11",
        "11111111111.111",
        "1111111111.1111",
        "111111111.11111",
        "11111111.111111",
        "1111111.1111111",
        "111111.11111111",
        "11111.111111111",
        "1111.1111111111",
        "111.11111111111",
        "11.111111111111",
        "1.1111111111111",
        "0.11111111111111",
        "0.011111111111111",
        "0.0011111111111111",
        "0.00011111111111111"
    };
    double doubles[] = {
        111111111111110000,
        11111111111111000,
        1111111111111100,
        111111111111110,
        11111111111111,
        1111111111111.1,
        111111111111.11,
        11111111111.111,
        1111111111.1111,
        111111111.11111,
        11111111.111111,
        1111111.1111111,
        111111.11111111,
        11111.111111111,
        1111.1111111111,
        111.11111111111,
        11.111111111111,
        1.1111111111111,
        0.11111111111111,
        0.011111111111111,
        0.0011111111111111,
        0.00011111111111111
    };

    for(int i = 0; i < 22; i++){
        cout 
            << (string2double(strings[i])==doubles[i])
            << " " 
            << (double2string(doubles[i])==strings[i])
            << endl;
    }



    return 0;
}
#包括
#包括
使用名称空间std;
字符串double2字符串(双值){
//...
}
双线双(字符串值){
//...
}
int main(){
字符串[]={
"111111111111110000",
"11111111111111000",
"1111111111111100",
"111111111111110",
"11111111111111",
"1111111111111.1",
"111111111111.11",
"11111111111.111",
"1111111111.1111",
"111111111.11111",
"11111111.111111",
"1111111.1111111",
"111111.11111111",
"11111.111111111",
"1111.1111111111",
"111.11111111111",
"11.111111111111",
"1.1111111111111",
"0.11111111111111",
"0.011111111111111",
"0.0011111111111111",
"0.00011111111111111"
};
双打[]={
111111111111110000,
11111111111111000,
1111111111111100,
111111111111110,
11111111111111,
1111111111111.1,
111111111111.11,
11111111111.111,
1111111111.1111,
111111111.11111,
11111111.111111,
1111111.1111111,
111111.11111111,
11111.111111111,
1111.1111111111,
111.11111111111,
11.111111111111,
1.1111111111111,
0.11111111111111,
0.011111111111111,
0.0011111111111111,
0.00011111111111111
};
对于(int i=0;i<22;i++){
库特

这基本上是不可能的。有太多的方法来说明 双精度文本格式,有关此格式的信息如下 一旦你转换成双倍就输了比如在我的机器上, 以下所有字符串都转换为相同的双精度:

1
1.0
1e0
1.000000000000000000001
+1.0
0001.0
还有更多的信息,一旦你 我要双人床

如果您将输入限制为特定格式,请说“科学” 总共15位,然后是15位以内的任何数字
如果您的机器使用IEEE,则应正确往返。

您的测试基于有缺陷的假设,例如,
X.1
首先可以表示为双精度(它不能)。如果您从一个双精度开始,将其转换为字符串,打印字符串,然后再转换回双精度,您会发现它会像您预期的那样来回运行。但并不是每个数字都可以在一开始就表示为双精度。基本上,无论您的精度有多高,有些数字根本无法用基数表示-2指数表示法,这是浮点数的编码方式。它们“理论上不适合双精度”。没有一个分数值可以用二进制浮点格式精确表示。如果需要精确表示非整数十进制数,则需要另一种表示方式。@tgmath提供了一个非常好的观点。除非您指定了双文本,否则通过
=
比较任何两个双文本的几率都是天文学由于前面提到的double中固有的数值不稳定性,因此,对于exmaple,
for(double i=0.0;i!=1.0;i+=0.1)< AusiDunt & Mike Seymour Damn,真的吗?我的整个生命都是谎言:D你能不能这么好地解释一下为什么这些数字不适合双?C++不能保证使用IEEE 754双倍,但是你可能会遇到的大多数实现方式,它有53位,而不是52位,因为有一个隐含的<代码> 1 < /代码>在52位的左边。我只对写出来的表示感兴趣。它不要求能读
1e0
,但如果它能读,就应该转换回
1
。基本上我想要最紧凑的版本,而不使用
e
,这意味着去掉前导零和尾随零,如果不需要它们。是的,那么可能就是您正在寻找的。您可以
ss>double
再次转换回来。您可以调整行为,但默认为十进制表示法,没有前导/尾随零(除了
-1.0
的单个前导零)。并且它应该像您所期望的那样往返。@arusidante当使用stringstream转换为字符串时,逗号后最多只能增加6位数字。因此,0.1111111将被转换为“0.111111”,缺少一个逗号。此外,它还向数字中添加了不需要的e+xxx语法。是否有任何工作关联?@arusidante默认值不是固定的(这就是我认为您所指的十进制),但取决于值(即1e100不会生成100位数字、一个十进制数字,然后再生成几个,但会使用科学记数法)。但它的设计目的是产生最小的表示形式,至少在大多数情况下是如此。@如果指定精度,请指定15,以确保所有可能的该精度字符串都将产生不同的
double
值(但并非所有
double
值都将产生唯一的字符串);如果希望所有可能的
double
值都具有唯一的字符串,请指定17(但该格式的多个不同字符串将产生相同的
double
值)。