最初にdoubleをstd :: to_stringで変換せずに、doubleをchar配列に変換(および丸め)しようとしています。ただし、代わりにランダムメモリテキストを受信しています。私は何が間違っているのですか?
これが私のコードです:
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
double
のリテラルバイトをchar
sに変換しています。 double
値はバイナリ表現(通常は IEEE 754 のようなもの)ですが、char
は文字のバイナリ表現(通常は に基づくもの)です。 [〜#〜] ascii [〜#〜] )。これら2つは互換性がありません。
残念ながら、これは何らかの変換プロセスを実行する必要があることを意味します。やりたくないと言ったstd::to_string()
、またはもっと複雑な_std::stringbuf
_(とにかく内部でstd::to_string()
を呼び出します)
double
(数値の2進表現)をchar
配列にコピーしています。これらのバイトが数字に対応する必要がある理由はありません。
to_string
を使用せずに手動で変換する場合は、一度に1桁ずつ引き出す必要があります。ダブルは文字のセットとしてメモリに保存されないため、メモリをコピーしてすべてが機能することを期待することはできません。 (doubleの解釈方法の詳細については、 ここ を参照してください)。
ただ これを行う 最初:
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()] = '\0';
// 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();
}
次に、返された文字列の文字を次のようにchar配列に入れることができます。
std::string str = to_string(doubleValue);
char digits[str.length()];
そして、Remy Lebeauからのコメントのおかげで、次のいずれかを行うことができます。
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] = '\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");
}
これを行うだけです:
#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;