float
値をchar*
言語C
に変換するにはどうすればよいですか?
7 に答える
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のようにはるかに合理的です
float
(以下を参照)。"%f"
で、 47以上sprintf(buf, "%f", FLT_MAX);
が必要になる可能性があります。sprintf(buf, "%f", DBL_MAX);
317+が必要な場合がありますchar
。を使用すると、コードで、の文字列バージョンと次に高い
".*"
バージョンを区別するために必要な小数点以下の桁数を定義できます。詳細については、浮動小数点値の精度を維持するためのPrintf幅指定子を参照してください。float x
float
を使用
"%e"
すると、コードは、の場合の結果であるfloat
すべての印刷ではなく、小さいsを互いに区別できます。"0.000000"
|x| < 0.0000005
使用例
#include <float.h>
#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、のようなスクラッチパッドには2倍のバッファサイズを使用することをお勧めしますbuf[FLT_STRING_SIZE*2]
。
堅牢性を高めるには、を使用しますsnprintf()
。
2番目の代替案として"%.*g"
。これは"%f"
、指数関数的に1.0に近い値の場合や、他の値の場合と同様"%e"
です。
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);