将double转换为Char数组C++

ifsvaxew  于 2023-01-28  发布在  其他
关注(0)|答案(8)|浏览(623)

我尝试将一个双精度型转换(和舍入)为一个字符数组,而不是先在双精度型上使用std::to_string进行转换。然而,我接收到的是随机内存文本。我做错了什么?
下面是我的代码:

double d = 1.0929998; 
d = std::round(d * 100) / 100;

char s[sizeof(d)];
std::memcpy(s,&d,sizeof(d));

结果:

    • s:**q = × p?

预期值:

    • s:**1.09
dnph8jn4

dnph8jn41#

您正在将double的文本字节转换为chardouble值是二进制表示(通常类似于IEEE 754),而char是字符的二进制表示(通常基于ASCII)。这两者不兼容。
不幸的是,这意味着您必须执行某种转换过程,要么是您说不想执行的std::to_string(),要么是更复杂的std::stringbuf(无论如何,它都会在幕后调用std::to_string()

sh7euo9m

sh7euo9m2#

您正在将double(数字的二进制表示)复制到char数组中;所以这些字节没有理由对应于数字字符。

gk7wooem

gk7wooem3#

这是没有测试,但你可以尝试:

std::string to_string(double x)
{
    std::ostringstream ss;
    ss << x;
    return ss.str();
}

然后,可以将返回的字符串字符放入char数组,如下所示:

std::string str = to_string(doubleValue);
char digits[str.length()];

然后,感谢雷米勒博的评论,你可以这样做:

std::strncpy(digits, to_string(doubleValue).c_str(), sizeof(digits))

或者这个:

to_string(doubleValue).copy(digits, sizeof(digits))
vojdkbi0

vojdkbi04#

不使用to_string的情况下,您自己的转换过程可能如下所示:

char* to_char_array(double num_double, int decimal_place)
{
    int num_int = std::round(num_double * pow(10, decimal_place));
    int sign = num_int < 0 ? 1 : 0;
    num_int = abs(num_int);

    if (num_int == 0)
    {
        char* s = (char*)malloc(decimal_place + 3);
        s[0] = '0';
        s[1] = '.';
        for (int i = 2; i < decimal_place + 2; i++)
            s[i] = '0';
        s[decimal_place + 2] = '\0';
        return s;
    }

    int digit_count = 1;
    int n = num_int;
    if (n >= 100000000) { digit_count += 8; n /= 100000000; }
    if (n >= 10000) { digit_count += 4; n /= 10000; }
    if (n >= 100) { digit_count += 2; n /= 100; }
    if (n >= 10) { digit_count++; }

    int size = digit_count + 1 + (decimal_place > 0 ? 1 : 0) + sign;
    char* s = (char*)malloc(size);

    for (int i = 0, integer = num_int; integer != 0; integer /= 10) {
        s[size - 2 - i++] = integer % 10 + 48;
        if (decimal_place > 0 && i == decimal_place)
            s[size - 2 - i++] = '.';
    }
    s[size - 1] = '\0';
    if (sign)
        s[0] = '-';
    return s;
}

void main()
{
    double d = -12.268904;
    char* s = to_char_array(d, 3);
    cout << "double: " << d << " - char array: " << s << endl;
    system("pause");
}
gg0vcinb

gg0vcinb5#

如果你想手工转换而不使用to_string,你将不得不一次取出一个数字。双精度浮点数不是作为一组字符存储在内存中,所以你不能只是复制内存并希望它全部工作。(关于双精度浮点数如何解释的更多信息,请参见here)。

sigwle7e

sigwle7e6#

先看do this

std::ostringstream strs;
strs << dbl;
std::string str = strs.str();

这会将双精度值dbl转换为字符串str
然后你可以把它转换成一个字符数组,如下所示:

char *cstr = new char[str.length()+1];
str.copy(cstr, str.length());
cstr[str.length()] = '\0';
// use cstr as needed...
delete[] cstr;

或者,简单地说:

const char *cstr = str.c_str();
// use cstr as needed...
mnemlml8

mnemlml87#

只要这样做:

#include <iostream>
  #include <string>
  #include <sstream>

  using namespace std;

  int main()
  {
      double a=23.25;
      char b[12];
      stringstream ss;

      ss << a;
      ss >> b;
      cout << b << endl;

      return 0;
  }

或者这个:

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

  using namespace std;

  int main()
  {

  double a=23.25;
  char b[12];
  stringstream ss  ;
  ss<<a;
  sprintf(b,ss.str().c_str());
  cout<<b<<endl;
  return 0;

或者这个:

here don't forget to
 #include<bits/stdc++.h>
  
  double a=23.25;
  char b[12];
  stringstream ss  ;
  ss<<a;
  strcpy(b,ss.str().c_str());
  cout<<b<<endl;
  return 0;
bmvo0sr5

bmvo0sr58#

将itoa应用于双精度浮点数,小数点盘向右移动2,然后通过在应有的位置添加小数点创建结果的副本:最后到位数字之前:

void convertToCharArray(double value, char *rezult)
{
  int k;

  char aux[10];

  itoa(value*100, aux, 10);
  int n = strlen(aux);
  k = 0;
  for(int i=0;i<n;i++)
  {
    if(i == n-1 - 1)
    {
      rezult[k++] = '.';
    }
    rezult[k++] = aux[i];
  }
  rezult[k++] = '\0';
}

用法:

int main()
{
    char aux[10];
    convertToCharArray(27.77, aux);
    cout << aux;
    return 0;
}

相关问题