double数値の切り捨て方 – プログラミング – Home

通知
すべてクリア

[解決済] double数値の切り捨て方


DBL
 DBL
(@DBL)
ゲスト
結合: 21年前
投稿: 6
Topic starter  

お世話になっています。

VC6+MFCでつくっています。

double d = 123.45 の値を 123.4

(少数点第2位を切り捨てたい) にするには

どんな処理をすればよいでしょうか?

やりかたをご存知のかた
よろしくお願いします。


引用未解決
トピックタグ
tib
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

10倍してint型の変数に代入。
再度double変数に代入。

int変数に代入するときに「intの範囲に収まる程度の数」である事が保証されるなら、と
いう条件付き。


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

floor


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

ごめん途中で押しちゃった

double x;
X=fool(D*10)/10;
これでどうですか?


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

>X=fool(D*10)/10;
書き間違った

X=floor(D*10)/10;


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

> 10倍してint型の変数に代入。
> 再度double変数に代入。
10で割る、を忘れてた。

# woodさんのやり方の方がずっといいです > 質問者


返信引用
ゲイ
 ゲイ
(@ゲイ)
ゲスト
結合: 22年前
投稿: 15
 

文字列にして切り捨てる<超確実


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

>文字列にして切り捨てる<超確実
は私としてはお勧めできませんね
四捨五入の処理を望むならお勧めしますけど

たぶん
sprintf(buf,%10.1d,d);
X=atof(buf);
のようなことすると思うのだけど

切り捨てる項目数が増えれば増えるほどソースが醜くなるし
関数化しても複数プロジェクトで使うようになったら
あとで「これなにやってるんだっけ?」になってしまうこともあるからです

この先悩む数値演算は四捨五入じゃねーの?


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

ゲイさんが「超確実」と言っているのはこんな方法じゃないでしょうか。

 sprintf( buf, %f, d );
 p = strchr( buf, '.' );
 *(++p) = '\0';

いいかどうかは別にして、こういう方法もあるよ、という意味で挙げられたのではないかと。


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

↑では小数点第1位を消しちゃってますね。

 sprintf( buf, %f, d );
 p = strchr( buf, '.' );
 *(p+2) = '\0';


返信引用
DBL
 DBL
(@DBL)
ゲスト
結合: 21年前
投稿: 6
Topic starter  

皆様、たくさんのご回答、ありがとうございます。

woodさんに教わった方法でいけました。

>この先悩む数値演算は四捨五入じゃねーの?

に関してなのですが

double dData = 812.65;

TRACE(%3.1f\n, dData);

dData = 123.45;

TRACE(%3.1f\n, dData);

とすると結果は

812.6
123.5

かたや、四捨五入、かたや切り捨てになっているようなので
切り捨てを採用してしまおうと思いました。

もし上記の出力が異なる理由をおわかりになるかたがいらっしゃいましたら
ご教授くださいませ。m(__)m


返信引用
isshi
 isshi
(@isshi)
ゲスト
結合: 21年前
投稿: 41
 

>もし上記の出力が異なる理由をおわかりになるかたがいらっしゃいましたら
>ご教授くださいませ。
10進浮動小数を2進表現する際の誤差のためです。
ためしに
TRACE(%.20f\n, dData);
とでもして、有効桁が全て表示されるようにしてみてください。
812.65 が2進化誤差のため 812.649999... となっていることが分かると思います。
123.45 も正確に2進化できないような気がしますが、10進表示に戻す際に
123.45000... に偶然にも丸められているようですね。

参考
http://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/vccore/html/_core_Why_Floating_Point_Numbers_May_Lose
_Precision.asp


返信引用
DBL
 DBL
(@DBL)
ゲスト
結合: 21年前
投稿: 6
Topic starter  

isshi様

ありがとうございました。
(いまいち、納得できませんけど^^)
そういうものだとあきらめます。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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