• ベストアンサー

VC++2008にてdouble型の置換について

現在VC++2008をMFCにて開発しております。VC++は初心者です。 画面から入力される値(小数点以下有り)を ファイル名として利用し出力する為 小数点とマイナスを特定の文字列に置換する処理をおこなっております。 画面から入力される値(CString)をそのままatof変換し、 double型で取得しますと 「3000.00000」のような値になってしまいます。 「3000.10100」のような値も入力される可能性があるので 一慨に小数点以下を丸める事もできません。 そういった事を考慮しますと、どういった処理が考えられるでしょうか? ご教授頂ければ幸いです。

  • 7u7
  • お礼率75% (63/83)

質問者が選んだベストアンサー

  • ベストアンサー
  • edomin7777
  • ベストアンサー率40% (711/1750)
回答No.2

#1です。 だったら、 文字列の長さを取得する。 文字列のままで右から「0」を取り除く。 (上の繰り返し。) 「0」じゃ無かったときに「.」だったら取り除く。 で、いいんじゃない?

7u7
質問者

お礼

edomin7777様、再度ご返答ありがとうございます。 やはり右から削除するのが確実ですかね。 ありがとうございました。

その他の回答 (2)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

doubleなどの浮動小数点型は、10進数で表したら必ず誤差がある、と考えておいてください。 3000.10100*100 - 3000101 ≠ 0です。 どうしてそうなるかはちょっと長くなるので、参考書なり「浮動小数点 丸め誤差」で検索するなりしてください。 ですので、「入力された文字列からファイル名を作る」だけなら、#1さんのいう通り、文字列を操作するのが正しいです. あえて加えれば、入力が意図したものでなかった場合の処理をどうするか、です

7u7
質問者

お礼

kmee様、ご返答ありがとうございます。 成程。浮動小数点と10進数では誤差があるのですね。 知りませんでした。 入力チェックに関しては他の箇所にてチェックする予定です。 ご教授ありがとうございました。

  • edomin7777
  • ベストアンサー率40% (711/1750)
回答No.1

質問の中に、どうしたいのかや、どういうものが欲しいのかが書かれていません。 「どういった処理が考えられるでしょうか?」 を聞くなら、どうしたいのかを補足してください。 例) 3000.00000→3000 3000.10100→3000.101 とか…。

7u7
質問者

お礼

edomin7777様。ご返答ありがとうございます。 質問内容に不備があり、申し訳ありませんでした。 edomin7777様のおっしゃる通り 3000.00000でしたら、3000を取得 3000.10100でしたら、3000.101を取得したいと考えております。

関連するQ&A

  • CString型からdouble型への変換

    C++は初心者です。VC4.0を使っていますがMFCなどは使っていません。 CString型の変数をint型やlong型への変換はなんとかできたのですが、double型へ変換することができずに困っています。atofを使えばいいのだと思い下記のように記述したのですが、コンパイルするとエラーがでます。   CString sample = "0.234";   double i;   i = atof((const char*)sample); error C2440: 'type cast' : cannot convert from 'class CString' to 'const char *' どう直せば無事にdouble i に0.234を格納できるのでしょうか?よろしくお願いします。

  • CStringの中から数字だけの場合と、その他が含まれる場合を識別する方法

    VC++6.0 MFCです。 CString についてなのですが、    キーボードで入力した文字(数字0~9、少数点.)を使って処理をしたいのですが、 キーボードで入力された文字の中にアルファベットなど、数字以外の文字が入っていた場合を 識別したいのですが、どのような方法がありますでしょうか? 下記のようにCString型 → doubl型にキャストして、数字だった場合は大小判定を して処理するのですが、アルファベットなどがある場合 double mojiDO = 0 に なってしまい、処理を初めてしまいます。 (1)数字とアルファベットなど数字以外の文字の混合はNG。(例"100gあ"はNG) (2)符号付の数字NG("-0.98"はNG) CString moji;//キーボード入力された文字が入っています。 double mojiDO = atof(moji);//CString型 → double型にキャスト if (mojiDO >= 0 && mojiDO <= 500 ){ //処理A } else if{ //処理B }

  • 置換の画面を起動するには?

    VBではなくてエクセルマクロ(VBA)の話なんですが、マクロ実行過程で置換の画面を自動的に起動させ、そこにユーザが入力した値を使って、続きの処理をさせたいのですが、置換の画面って起動できるようにプログラムすることはできませんか? →置換の画面って標準で用意されてないのでしょうか?

  • 【VC++6.0(MFC)】CString型の変数から数字部分を取り出すには?

    いつも大変お世話になっています。 VC初心者です。 現在、VC++6.0(MFC)でコーディングしております。 早速ですが、有識者の方がいらっしゃいましたら ご教授頂きたくお願いします。 ===質問=== CString型変数に以下のような数値を含む文字列から 数値部分だけを取り出すにはどうやってソースを 組めば宜しいでしょうか? ===例01=== CString cs1 = "2009年7月29日"; この文字列から "2009","7","29"を取得したい ===例02=== CString cs2 = "AM10:00:00 -0.4℃"; この文字列から "10","0","0","-0.4"を取得したい 以上、よろしくお願いします。

  • VC++2008にて、画面の動的変更処理について

    現在VC++2008のMFCにて開発を行っております。 ダイアログのテキストボックスAの値を変更し、 カーソルが移動した際に 他のテキストボックスBの値を、Aの値により処理がかかる のような処理は無理なのでしょうか? やはり、ボタン押下でしか画面の更新は無理なのでしょうか? ご教授頂ければ幸いです。

  • VC++2010で波形線を出力したいのですが・・・

    VC++2010で波形線を出力したいのですが、サイト探しても難しく自分にはわかりませんでした。 なのでまずは線を出力したいと思います。 VC++2010 MFCで どうやったら 線を出力できるかよろしくお願いします。 考えでは エディットボックスから値を入力し、それを読み取って線を出力するような プログラムにしたいと考えています。 ではよろしくお願いします。

  • 四捨五入について質問です。

    四捨五入について質問です。 GUIアプリのエディットコントロール画面から、任意の数値を入力させ、 小数点以下n桁で四捨五入をさせたいと考えています。 しかし、なかなかうまくいかないのが現状です。 試したのは以下の通りです。 ・atofを用い、数値を取り込み、下位n桁目を四捨五入 -> 当然だめです ・atoiを用い、数値を取り込み、10^nをかけて整数値にしてから四捨五入 -> 0.05と0.0499...の違いがつけられない やはり文字列処理しかないのでしょうか? (文字列を取り込み、小数点以下n文字目が5以上かどうかで判定、のような・・・) もしよろしければ、皆さんのお知恵をお貸しください。

  • Wordの置換方法について

    Wordの文書中に以下のようなものがあります。 (1)全角ピリオドの小数点23.56とか562.8とか多数あります。それと句点の「.」全角ピリオドがあります。このうち句点の「.」だけを「。」に置換したい。 (2)45,264,256などと全角コンマの入った数字と読点の全角コンマ「,」があります。このうち読点の「,」だけを全角「、」に置換したい。 この2点のやり方を教えてください。 方法は(1)と(2)を1回でやる方法と別々に2回でやる方法を教えてください。

  • CStdioFile での数値データの読みこみ

    VC++ で MFC アプリケーションを作っています。 数字の入ったファイル,たとえば以下のような suuji.dat です。 int 型の数字が 5 つ入っています (実際のプログラムで私が使っているのは double 型ですが…) 。 /**  * suuji.dat の始まり  */ 1 2 3 4 5 /**  * suuji.dat の終わり  */ これを CStdioFile で読み込むとき,以下のような方法をとっています。   int num;   CString temp;   CStdioFile file;   while ( file.ReadString(temp) ) {     num = atof(temp);     ここで num を vector<int> に収納する   }   file.Close(); 上の方法は,流れとして, ○とりあえず CString 型として読みこみ   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ○ atof() 関数によって数値データとして使う   ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ という方法を使っていますが,すごく遠回りなことをしている気分になります。 まだ “Hello, world!” を動かして 4 ヶ月たらずのビギナーです。 プログラミングの作法とかは,ぜんぜん分かっていません。 もし CStrioFile で数値を読み込む,もっとシンプルな方法があればご教授いただけると幸いです。

  • Excelで「置換」機能を使用したら元に戻らなくなって・・・・・・

    Excelで「7」を「8」にするため「置換」機能を使用しました。 ところが、その後「Excel」はもとよりWord、Accessを使用しても「7」と入力しリターン、または、「7.」と小数点を入力した時点で「8」になってしまいます。 この現象は、数値入力のみで、文字列での入力では、このようなことはありません。 直し方を教えてください。

専門家に質問してみよう