float型、double型の値を任意の小数点以下を四捨五入にする関数、または方法をご存知の方が
いましたら教えていただけませんでしょうか。MSDNで調べてはいるのですが分かりません。
環境はWin2000、VC++6.0です。
floor, ceil をMSDNから探しましょう。
必要とする精度にもよるのですが
一度文字列変換してから行う方法でやったことあるよ
+とかーの判断も必要でしたし、少数以下第何位までの精度がほしいかにもよるし
関数だけで何とかしようとしても思ったとおりの結果
にならないみたいですよ
四捨五入専用関数はないとおもいますけど?
...ごめん、マチガイというか、補足。
0.5を加えてからfloorを呼び出せばよさげです。
四捨五入の結果をintで欲しいなら:
double x = ...;
int n = (int)(x + 0.5);
「任意の小数点以下を四捨五入」というのがネックと思います。
小数点以下の四捨五入ならばεπιστημηの方法でよいと思いますが、
0.004→0.00
0.005→0.01
のような場合は、一度100を掛けてから四捨五入した後に、100で割るでどうでしょう
あ...フォローありがとうございます。
四捨五入した結果をfloat型、double型に戻すと、期待した値にならない場合もあるかも
(^^)
手元にこんなのがありました。むかーし作った奴です。
double Pai::Round( double value, int figure )
{
bool isNagative = ( value < 0 );
if( isNagative ) value = -value;
double rate = pow( 10, figure );
int tmp = int(value * rate + 0.5);
value = tmp/rate;
if( isNagative ) value = -value;
return value;
}
みなさんありがとうございました。
私も0.5をプラスしていろいろして試みましたがPAIさんのが分かりやすく使いたいと思いま
す。
結構安易に考えていたのですが、意外と四捨五入は難しいものですね。
勉強になりました。
うお、Nagativeってなんじゃ?
・・・恥ずかし。
解決しちゃったぽいですが・・
doubleで計算してintにキャストし、あとで割る方法を使うと
数値によってはintにキャストした時点で誤差が出てしまい
正しい結果が得られないことがあります。
試しに Round(1.005,2) (3桁目で四捨五入)をしてみると
結果が 1.01にならず 1.0 になります。
floor使ってもたぶん同じ結果だったような。
なるほど、奥が深いですね。
100.5+0.50 は 101 に100の方向から十分近い、101より小さい数になってしまうわけですね。
・・・0.501足すとか・・・だめですかね。
やっぱり一旦文字列に換えて、とかやる必要があるんでしょうか。
浮動小数点数を使う限りこの問題は避けられないと思います。
2進化10進数(BCD)ライブラリを使うとよいそうですが、
私自身は使ったことないです(^^;
解決したつもりでいましたが、甘かったようです。。。
確かに期待通りの値が出ませんでした。(ガッカリ・・・)
一旦文字列にして地道に四捨五入をしないと駄目なのですかね?
本当に安易に考えていました。
もともと'おおよその値'を求めるのが目的の四捨五入に
それほどの精度を必要とするのですか?