Преобразование double в массив символов C++
Я пытаюсь преобразовать (и округлить) double в массив символов без преобразования с помощью std:: to_string на double first. Однако вместо этого я получаю случайный текст памяти. Что я делаю не так?
вот мой код:
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
6 ответов
Вы переводите буквальном байт double
на char
s. The double
значение является двоичным представлением (обычно что-то вроде IEEE 754) а char
является двоичным представлением символа (обычно что-то основано на ASCII). Эти два несовместимы.
к сожалению, это означает, что вы должны сделать какой-то процесс преобразования. Либо std::to_string()
что вы сказали, что вы не хотите делать, или более сложный std::stringbuf
(который будем называть std::to_string()
все равно под капотом)
вы копируете double
(что является двоичным представлением для числа) в char
массив; нет причин, по которым эти байты должны соответствовать цифровым символам.
Если вы хотите конвертировать вручную без использования to_string
, вам придется вытаскивать цифры по одному за раз. Двойник не хранится в памяти как набор символов, поэтому вы не можете просто скопировать память и надеяться, что все это работает. (подробнее о том, как интерпретируются двойники, см. здесь).
просто этого первый:
std::ostringstream strs;
strs << dbl;
std::string str = strs.str();
это преобразует double dbl
в строку str
.
затем вы можете преобразовать его в массив символов такой:
char *cstr = new char[str.length()+1];
str.copy(cstr, str.length());
cstr[str.length()] = '';
// use cstr as needed...
delete[] cstr;
или так:
const char *cstr = str.c_str();
// use cstr as needed...
это не тестируется, но вы можете попробовать:
std::string to_string(double x)
{
std::ostringstream ss;
ss << x;
return ss.str();
}
затем вы можете поместить символы возвращаемой строки в массив символов, например:
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))
процесс преобразования вашей собственной личности без использования 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] = '';
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] = '';
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");
}