我尝试将一个双精度型转换(和舍入)为一个字符数组,而不是先在双精度型上使用std::to_string进行转换。然而,我接收到的是随机内存文本。我做错了什么?下面是我的代码:
double d = 1.0929998; d = std::round(d * 100) / 100; char s[sizeof(d)]; std::memcpy(s,&d,sizeof(d));
结果:
预期值:
dnph8jn41#
您正在将double的文本字节转换为char。double值是二进制表示(通常类似于IEEE 754),而char是字符的二进制表示(通常基于ASCII)。这两者不兼容。不幸的是,这意味着您必须执行某种转换过程,要么是您说不想执行的std::to_string(),要么是更复杂的std::stringbuf(无论如何,它都会在幕后调用std::to_string())
double
char
std::to_string()
std::stringbuf
sh7euo9m2#
您正在将double(数字的二进制表示)复制到char数组中;所以这些字节没有理由对应于数字字符。
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))
vojdkbi04#
不使用to_string的情况下,您自己的转换过程可能如下所示:
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"); }
gg0vcinb5#
如果你想手工转换而不使用to_string,你将不得不一次取出一个数字。双精度浮点数不是作为一组字符存储在内存中,所以你不能只是复制内存并希望它全部工作。(关于双精度浮点数如何解释的更多信息,请参见here)。
sigwle7e6#
先看do this:
std::ostringstream strs; strs << dbl; std::string str = strs.str();
这会将双精度值dbl转换为字符串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...
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;
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; }
8条答案
按热度按时间dnph8jn41#
您正在将
double
的文本字节转换为char
。double
值是二进制表示(通常类似于IEEE 754),而char
是字符的二进制表示(通常基于ASCII)。这两者不兼容。不幸的是,这意味着您必须执行某种转换过程,要么是您说不想执行的
std::to_string()
,要么是更复杂的std::stringbuf
(无论如何,它都会在幕后调用std::to_string()
)sh7euo9m2#
您正在将
double
(数字的二进制表示)复制到char
数组中;所以这些字节没有理由对应于数字字符。gk7wooem3#
这是没有测试,但你可以尝试:
然后,可以将返回的字符串字符放入char数组,如下所示:
然后,感谢雷米勒博的评论,你可以这样做:
或者这个:
vojdkbi04#
不使用
to_string
的情况下,您自己的转换过程可能如下所示:gg0vcinb5#
如果你想手工转换而不使用
to_string
,你将不得不一次取出一个数字。双精度浮点数不是作为一组字符存储在内存中,所以你不能只是复制内存并希望它全部工作。(关于双精度浮点数如何解释的更多信息,请参见here)。sigwle7e6#
先看do this:
这会将双精度值
dbl
转换为字符串str
。然后你可以把它转换成一个字符数组,如下所示:
或者,简单地说:
mnemlml87#
只要这样做:
或者这个:
或者这个:
bmvo0sr58#
将itoa应用于双精度浮点数,小数点盘向右移动2,然后通过在应有的位置添加小数点创建结果的副本:最后到位数字之前:
用法: