小数点を取り除くには?

解決


ネロ  2006-09-08 20:50:47  No: 62955

こんにちわ。

char型の文字列"1.00"〜"-1.00"について、

まず小数点を取り除き、数値"100"〜"-100"としてint型に格納する。

そして、マイナスの符号がついているなら、
ビットを反転させ、1を加える

という処理を行おうと思っているのですが、C言語でどのように
記述すればいいのでしょうか?

以上、宜しくお願いします。


Blue  2006-09-08 21:42:58  No: 62956

>まず小数点を取り除き
strchr関数とstrcpy関数あたりを使って削除してください。
(C++ならば簡単なんだが)

>そして、マイナスの符号がついているなら、
>ビットを反転させ、1を加える

int n = -100; 
printf( "%x\n", n );

はどんな文字列が表示されますか?望んでいたものではないでしょうか?
(つまり、C言語ではちゃんと符号ビットを持っているということ)


tetrapod  2006-09-09 00:19:16  No: 62957

strなんちゃらで削除するくらいなら俺ならこっち
if (sscanf(str, "%d.%d", &x, &y)==2) z=x*100+y;


Blue  2006-09-09 00:31:33  No: 62958

>strなんちゃらで削除するくらいなら俺ならこっち
書式が決まっているなら、sscanfで十分ですね。

>strchr関数とstrcpy関数あたりを使って削除してください。
strcpyを使うよりも、memmove関数の方がよかったかも。

char s[] = "-1.01";
char* pos = strchr( s, '.' );
if ( pos != NULL )
{
    memmove( pos, pos + 1, strlen( pos ) );
}
int n = strtol( s, NULL, 10 );


tetrapod  2006-09-09 00:39:36  No: 62959

double d;
if (sscanf(str,"%g",&d)==1) z=(int)(d*100);
という人がいたらツッコもうと思っていたのですがさすがにいませんか。


yoh2  2006-09-09 06:34:44  No: 62960

z = (int)(strtod(str, NULL) * 100);

なんてことを考えた私はツッコミの対象ですか?
"-1.00" - "1.00"の201個中、
VC++ 6, 2005  : 6個
bcc32、gcc、dmc: 88個
の変換ミスがあったので、

  z = floor(strtod(str, NULL) * 100 + .5);

で誤魔化して満足してしまっては処置なしですか?(^^;


ネロ  2006-09-09 08:51:32  No: 62961

皆さまからのアドバイスで問題が解決出来ました。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加