如何将char *转换为double?

时间:2015-03-29 11:26:32

标签: c++

我尝试了两种方法来转换我的char*类型ss 到双重类型。 这是我的代码(在VC ++ 6.0 windows64位编译)

int main()
{
    char *ss = "-1964734.544";
    cout<<ss<<endl;
    cout<<*reinterpret_cast<double*>(ss)<<endl;
    cout<<*(double *)ss<<endl;
}

结果是:

-1964734.544
3.06123e-057
3.06123e-057

我不清楚有什么问题,以及如何将char*转换为双倍。

6 个答案:

答案 0 :(得分:3)

您可以像这样使用strtoddouble smth=strtod(ss,NULL,10);

可以使用稍微不同的语法。有关示例,请参阅this

答案 1 :(得分:3)

你的问题是 CAST不是转换

char *ss = "-1964734.544";
cout<<ss<<endl;
cout<<*reinterpret_cast<double*>(ss)<<endl;
cout<<*(double *)ss<<endl;

是您将一串字符转换为数字。这意味着你的记忆包含的数字是ascii值:

"-1964734.544"

以内容存储在内存中:

45, 49, 57, 54, 52, 55, 51, 52, 46, 53, 52, 52
二进制的

变为:

00101101,00110001,00111001,00110110,00110100,00110111,00110011,00110100,00101110,00110101,00110100,00110100

在记忆中。当转换为double时,您强制编译器将这些数字视为以不同方式读取,这是在IEEE754 way for doubles之后。然后45,49,57,52意味着使用数字编码完全不同的东西。

然后,考虑到字符是8位和双32位,在演员之后,你的记忆然后按以下方式映射:

00101101001100010011100100110110,
00110100001101110011001100110100,
00101110001101010011010000110100

然后做一个&#34;手册&#34;对IEEE754的解释你得到三个浮点数:

1.0073988518377597E-11
1.7061830703823944E-7
4.120100094429091E-11

奇怪的是,你没有匹配任何你的值,所以你的记忆大小可能会有所不同,或者在演员表中会发生一些魔法。

好方法是不重新解释内存,而是转换值,一个好的解决方案是使用C中的strtod()或C ++标准库中的stod。您将找到许多方法来处理其他答案中的转换或复制此转换的帖子。

如果您想获得更多乐趣,请尝试floats on that webpage

答案 2 :(得分:2)

您应该使用std::stod函数(C ++ 11)和更现代的编译器

double result = std::stod(ss);

或者使用std::stringstream

中的<sstream>
std::stringstream sstrm(ss);
double d;
sstrm >> d;

答案 3 :(得分:-1)

如果您使用强制转换然后将指针数据视为双精度值,这是错误的,因为指针是表示内存中地址的整数,您需要解释char*指向的数据以获得正确的结果,使用sscanfatof或其他功能char*并提供double

答案 4 :(得分:-1)

https://msdn.microsoft.com/en-us/library/aa272023%28v=vs.60%29.aspx

使用atof(const char*)

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    double pi;
    const char * str = "3.14";

    pi = atof(str);

    cout << pi << endl;

    return 0;
}

答案 5 :(得分:-1)

除非使用字符集reinterpret_cast在内存中表示值-1964734.544的浮点变量,否则{'-', '1', '9', '6', '4', '7', '3', '4', '.', '5', '4', '4'}方法不太可行。

没有浮点值以这种方式表示在内存中。周期。

如果您需要C解决方案,请使用sscanf()strtod()等功能。由于向后兼容性,这些在C ++中是可能的,但大多数都被正式弃用。

C ++解决方案将涉及使用istringstream,例如;

#include <sstream>
#include <iostream>

int main()
{
     std::istringstream s("-1964734.544");
     double x;
     if (s >> x)
        std::cout << " x = " << x << '\n';
     else
        std::cout << "Whoops!  String cannot be interpreted as floating point\n";
     return 0;
}