web-dev-qa-db-ja.com

文字列を浮動小数点に変換する方法は?

#include<stdio.h>
#include<string.h>

int main() 
{
    char s[100] ="4.0800" ; 

    printf("float value : %4.8f\n" ,(float) atoll(s)); 
    return 0; 
}

出力は4.08000000になるはずですが、4.00000000しか取得できませんでした。

ドットの後に数字を取得する方法はありますか?

46
abubacker

代わりにatof()またはstrtof() *を使用します。

printf("float value : %4.8f\n" ,atof(s)); 
printf("float value : %4.8f\n" ,strtof(s, NULL)); 

http://www.cplusplus.com/reference/clibrary/cstdlib/atof/
http://www.cplusplus.com/reference/cstdlib/strtof/

  • atoll()は整数用です。
  • atof()/strtof()はフロート用です。

atoll()4.00のみを取得する理由は、最初の非数字を検出すると解析を停止するためです。

* strtof()にはC99またはC++ 11が必要であることに注意してください。

55
Mysticial

残念ながら、これを簡単に行う方法はありません。すべてのソリューションには欠点があります。

  1. atof()またはstrtof()を直接使用します。これは、ほとんどの人が行うように指示するものであり、ほとんどの場合機能します。ただし、プログラムがロケールを設定するか、ロケールを設定するライブラリ(たとえば、ローカライズされたメニューを表示するグラフィックライブラリ)を使用し、ユーザーのロケールが小数点記号が.ではない言語に設定されている場合(fr_FRなど、区切り記号が,)これらの関数は、.で解析を停止し、4.0を取得します。

  2. atof()またはstrtof()を使用しますが、ロケールを変更します。 setlocale(LC_ALL|~LC_NUMERIC, "");または同類の呼び出しの前にatof()を呼び出すだけです。 setlocaleの問題は、プロセスに対してグローバルであり、プログラムの残りの部分に干渉する可能性があることです。 setlocale()を使用して現在のロケールを照会し、完了後に復元する場合があることに注意してください。

  3. 独自のフロート解析ルーチンを作成します。指数解析や16進浮動小数点数などの高度な機能が必要ない場合、これは非常に高速です。

また、値4.08はfloatとして正確に表現できないことに注意してください。実際に取得する値は4.0799999237060546875です。

28
sam hocevar

文字列をdoubleに変換するために関数atof()を使用すべきではないのはなぜですか?

成功すると、atof()関数は変換された浮動小数点数をdouble値として返します。有効な変換を実行できなかった場合、関数はゼロ(0.0)を返します。変換された値が表現可能な値の範囲外にdoubleである場合、undefined behavior

参照: http://www.cplusplus.com/reference/cstdlib/atof/

代わりに、関数 strtod() を使用すると、より堅牢になります。

このコードを試してください:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    char s[100] = "4.0800";
    printf("Float value : %4.8f\n",strtod(s,NULL));
    return 0;
}

次の出力が得られます。

Float value : 4.08000000

17
user1336087

atof()を使用

しかし、これは非推奨です。代わりにこれを使用してください:

const char* flt = "4.0800";
float f;
sscanf(flt, "%f", &f);

http://www.cplusplus.com/reference/clibrary/cstdlib/atof/

atof()は、失敗時と0の変換時に0.0を返します。使用しないのが最善です。

4
Luchian Grigore

Sscanfを使用して、文字列を浮動小数点に変換できます。

#include<stdio.h>    
#include<string.h>    

int main() 
{
    char str[100] ="4.0800" ;     
    const char s[2] = "-";   
    char *token;
    double x;
   /* get the first token */ 
   token = strtok(str, s);
   sscanf(token,"%f",&x);
    printf( " %f",x );

    return 0; 
}
1
Kavita Jain
0
mwp