dポイントプレゼントキャンペーン実施中!

四捨五入について質問です。
GUIアプリのエディットコントロール画面から、任意の数値を入力させ、
小数点以下n桁で四捨五入をさせたいと考えています。
しかし、なかなかうまくいかないのが現状です。

試したのは以下の通りです。
・atofを用い、数値を取り込み、下位n桁目を四捨五入 -> 当然だめです
・atoiを用い、数値を取り込み、10^nをかけて整数値にしてから四捨五入 -> 0.05と0.0499...の違いがつけられない

やはり文字列処理しかないのでしょうか?
(文字列を取り込み、小数点以下n文字目が5以上かどうかで判定、のような・・・)
もしよろしければ、皆さんのお知恵をお貸しください。

A 回答 (4件)

浮動小数点の誤差に起因する問題です。

次を参照してください。たいへん奥が深いですよ。
http://www.geocities.co.jp/SiliconValley-Bay/5308/
    • good
    • 0
この回答へのお礼

すばらしいHPのご紹介、ありがとうございます。
浮動小数点の誤差に起因する問題についてはソ開くらいまでなら認識していましたが、
具体的に集中的に集められたHPで、よりいっそう知識が深まった気がします。

結局、文字列取り込みのところは、小数点以下n+1桁以下を削除する取り込みを行い、
あとはNo2の方もおっしゃっていたように、整数値にあげてから切り捨ててうまくいきました。

お礼日時:2010/09/04 23:32

>どこかにテクが入っているのでしょうか?



(3)+0.5する
の箇所です。
    • good
    • 0

よくあるやりかたは


1)atofで文字列→浮動小数点(double)
2)10.0^n 掛ける
3)+0.5する
4)floorで整数化
5)10.0^nで割る
とです。

この回答への補足

申し訳ございません、
・atoiを用い、数値を取り込み、10^nをかけて整数値にしてから四捨五入 -> 0.05と0.0499...の違いがつけられない

とどのように違うのでしょうか・・・。
どこかにテクが入っているのでしょうか?
よくわかりません・・・・

補足日時:2010/09/04 22:49
    • good
    • 0

四捨五入は施したい桁に5を加えてその桁以下を切り捨てればいいのですが、それではまずいのでしょうか?

この回答への補足

ご回答ありがとうございます。

よく考えると、躓いているのって文字列の取り込みのところでした。
0.1235

0.1234999999999999999999999999999999999999999
を同じようにatofで取り込んでいたので、
取り込んだ後、どっちも同じ数と認識されていたようです。

うーん。

補足日時:2010/09/04 22:48
    • good
    • 0
この回答へのお礼

ありがとうございました。
結局、文字列取り込みのところは、小数点以下n+1桁以下を削除する取り込みを行い、
あとはNo2の方もおっしゃっていたように、整数値にあげてから切り捨ててうまくいきました。

ちなみに、0.205を小数点第三位で四捨五入する時、No1がおっしゃられた方法だと桁下がりになります。

お礼日時:2010/09/04 23:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!