- ベストアンサー
VC++2008にてdouble型の置換について
現在VC++2008をMFCにて開発しております。VC++は初心者です。 画面から入力される値(小数点以下有り)を ファイル名として利用し出力する為 小数点とマイナスを特定の文字列に置換する処理をおこなっております。 画面から入力される値(CString)をそのままatof変換し、 double型で取得しますと 「3000.00000」のような値になってしまいます。 「3000.10100」のような値も入力される可能性があるので 一慨に小数点以下を丸める事もできません。 そういった事を考慮しますと、どういった処理が考えられるでしょうか? ご教授頂ければ幸いです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 だったら、 文字列の長さを取得する。 文字列のままで右から「0」を取り除く。 (上の繰り返し。) 「0」じゃ無かったときに「.」だったら取り除く。 で、いいんじゃない?
その他の回答 (2)
- kmee
- ベストアンサー率55% (1857/3366)
doubleなどの浮動小数点型は、10進数で表したら必ず誤差がある、と考えておいてください。 3000.10100*100 - 3000101 ≠ 0です。 どうしてそうなるかはちょっと長くなるので、参考書なり「浮動小数点 丸め誤差」で検索するなりしてください。 ですので、「入力された文字列からファイル名を作る」だけなら、#1さんのいう通り、文字列を操作するのが正しいです. あえて加えれば、入力が意図したものでなかった場合の処理をどうするか、です
お礼
kmee様、ご返答ありがとうございます。 成程。浮動小数点と10進数では誤差があるのですね。 知りませんでした。 入力チェックに関しては他の箇所にてチェックする予定です。 ご教授ありがとうございました。
- edomin7777
- ベストアンサー率40% (711/1750)
質問の中に、どうしたいのかや、どういうものが欲しいのかが書かれていません。 「どういった処理が考えられるでしょうか?」 を聞くなら、どうしたいのかを補足してください。 例) 3000.00000→3000 3000.10100→3000.101 とか…。
お礼
edomin7777様。ご返答ありがとうございます。 質問内容に不備があり、申し訳ありませんでした。 edomin7777様のおっしゃる通り 3000.00000でしたら、3000を取得 3000.10100でしたら、3000.101を取得したいと考えております。
お礼
edomin7777様、再度ご返答ありがとうございます。 やはり右から削除するのが確実ですかね。 ありがとうございました。