float
値をC
言語のchar*
に変換するにはどうすればよいですか?
char buffer[64];
int ret = snprintf(buffer, sizeof buffer, "%f", myFloat);
if (ret < 0) {
return EXIT_FAILURE;
}
if (ret >= sizeof buffer) {
/* Result was truncated - resize the buffer and retry.
}
myFloat
の文字列表現をmyCharPointer
に保存します。ただし、文字列がそれを保持するのに十分な大きさであることを確認してください。
snprintf
は、sprintf
よりも優れたオプションです。これは、引数2で指定したバッファーのサイズを超えて書き込みを行わないことを保証するためです。
char array[10];
sprintf(array, "%f", 3.123);
sprintf :(MSDNから)
Arduinoの場合:
//temporarily holds data from vals
char charVal[10];
//4 is mininum width, 3 is precision; float value is copied onto buff
dtostrf(123.234, 4, 3, charVal);
monitor.print("charVal: ");
monitor.println(charVal);
回答を受け入れてからずっと。
他の多くの回答が提案しているように、sprintf()
、または関連する関数を使用してください。
_"%.*e"
_を使用すると、コードはさまざまな問題を解決します。
必要な最大バッファサイズは18のようにはるかに合理的です。sprintf(buf, "%f", FLT_MAX);
は47+を必要とします。 sprintf(buf, "%f", DBL_MAX);
には317+が必要な場合があります
_".*"
_を使用すると、コードは_float x
_の文字列バージョンと次に高いfloat
を区別するために必要な小数点以下の桁数を定義できます。詳細については、 浮動小数点値の精度を維持するためのPrintf幅指定子 を参照してください。
_"%e"
_を使用すると、コードが、_"0.000000"
_の結果である_|x| < 0.0000005
_をすべて印刷するのではなく、小さなfloat
sを互いに区別できます。
_#define FLT_STRING_SIZE (1+1+1+(FLT_DECIMAL_Dig-1)+1+1+ 4 +1)
// - d . dddddddd e - dddd \0
char buf[FLT_STRING_SIZE];
sprintf(buf, "%.*e", FLT_DECIMAL_Dig-1, some_float);
_
アイデア:
IMO、_buf[FLT_STRING_SIZE*2]
_のようなスクラッチパッドに2倍のバッファサイズを使用することをお勧めします。
堅牢性を高めるには、snprintf()
を使用します。
char* str=NULL;
int len = asprintf(&str, "%g", float_var);
if (len == -1)
fprintf(stderr, "Error converting float: %m\n");
else
printf("float is %s\n", str);
free(str);
typedef union{
float a;
char b[4];
} my_union_t;
バイト単位でfloatデータ値にアクセスし、キャストせずに8ビット出力バッファー(USARTなど)経由で送信できます。
char array[10];
snprintf(array, sizeof(array), "%f", 3.333333);