四捨五入の方法 – プログラミング – Home

通知
すべてクリア

[解決済] 四捨五入の方法

固定ページ 1 / 2

こうちゃ
 こうちゃ
(@こうちゃ)
ゲスト
結合: 22年前
投稿: 3
Topic starter  

float型、double型の値を任意の小数点以下を四捨五入にする関数、または方法をご存知の方が
いましたら教えていただけませんでしょうか。MSDNで調べてはいるのですが分かりません。
環境はWin2000、VC++6.0です。


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

floor, ceil をMSDNから探しましょう。


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

必要とする精度にもよるのですが
一度文字列変換してから行う方法でやったことあるよ
+とかーの判断も必要でしたし、少数以下第何位までの精度がほしいかにもよるし

関数だけで何とかしようとしても思ったとおりの結果
にならないみたいですよ

四捨五入専用関数はないとおもいますけど?


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

...ごめん、マチガイというか、補足。

0.5を加えてからfloorを呼び出せばよさげです。

四捨五入の結果をintで欲しいなら:
double x = ...;
int n = (int)(x + 0.5);


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

「任意の小数点以下を四捨五入」というのがネックと思います。

小数点以下の四捨五入ならばεπιστημηの方法でよいと思いますが、
  0.004→0.00
  0.005→0.01
のような場合は、一度100を掛けてから四捨五入した後に、100で割るでどうでしょう


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

あ...フォローありがとうございます。


返信引用
八郎
 八郎
(@八郎)
ゲスト
結合: 22年前
投稿: 1
 

四捨五入した結果をfloat型、double型に戻すと、期待した値にならない場合もあるかも
(^^)


返信引用
PAI
 PAI
(@PAI)
ゲスト
結合: 23年前
投稿: 359
 

手元にこんなのがありました。むかーし作った奴です。

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;
}


返信引用
こうちゃ
 こうちゃ
(@こうちゃ)
ゲスト
結合: 22年前
投稿: 3
Topic starter  

みなさんありがとうございました。
私も0.5をプラスしていろいろして試みましたがPAIさんのが分かりやすく使いたいと思いま
す。
結構安易に考えていたのですが、意外と四捨五入は難しいものですね。
勉強になりました。


返信引用
PAI
 PAI
(@PAI)
ゲスト
結合: 23年前
投稿: 359
 

うお、Nagativeってなんじゃ?

・・・恥ずかし。


返信引用
EIJI
 EIJI
(@EIJI)
ゲスト
結合: 24年前
投稿: 76
 

解決しちゃったぽいですが・・

doubleで計算してintにキャストし、あとで割る方法を使うと
数値によってはintにキャストした時点で誤差が出てしまい
正しい結果が得られないことがあります。

試しに Round(1.005,2) (3桁目で四捨五入)をしてみると
結果が 1.01にならず 1.0 になります。
floor使ってもたぶん同じ結果だったような。


返信引用
PAI
 PAI
(@PAI)
ゲスト
結合: 23年前
投稿: 359
 

なるほど、奥が深いですね。
100.5+0.50 は 101 に100の方向から十分近い、101より小さい数になってしまうわけですね。

・・・0.501足すとか・・・だめですかね。

やっぱり一旦文字列に換えて、とかやる必要があるんでしょうか。


返信引用
EIJI
 EIJI
(@EIJI)
ゲスト
結合: 24年前
投稿: 76
 

浮動小数点数を使う限りこの問題は避けられないと思います。
2進化10進数(BCD)ライブラリを使うとよいそうですが、
私自身は使ったことないです(^^;


返信引用
こうちゃ
 こうちゃ
(@こうちゃ)
ゲスト
結合: 22年前
投稿: 3
Topic starter  

解決したつもりでいましたが、甘かったようです。。。
確かに期待通りの値が出ませんでした。(ガッカリ・・・)
一旦文字列にして地道に四捨五入をしないと駄目なのですかね?
本当に安易に考えていました。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

もともと'おおよその値'を求めるのが目的の四捨五入に
それほどの精度を必要とするのですか?


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました