お世話になっています。
VC6+MFCでつくっています。
double d = 123.45 の値を 123.4
(少数点第2位を切り捨てたい) にするには
どんな処理をすればよいでしょうか?
やりかたをご存知のかた
よろしくお願いします。
10倍してint型の変数に代入。
再度double変数に代入。
int変数に代入するときに「intの範囲に収まる程度の数」である事が保証されるなら、と
いう条件付き。
floor
ごめん途中で押しちゃった
double x;
X=fool(D*10)/10;
これでどうですか?
>X=fool(D*10)/10;
書き間違った
X=floor(D*10)/10;
> 10倍してint型の変数に代入。
> 再度double変数に代入。
10で割る、を忘れてた。
# woodさんのやり方の方がずっといいです > 質問者
文字列にして切り捨てる<超確実
>文字列にして切り捨てる<超確実
は私としてはお勧めできませんね
四捨五入の処理を望むならお勧めしますけど
たぶん
sprintf(buf,%10.1d,d);
X=atof(buf);
のようなことすると思うのだけど
切り捨てる項目数が増えれば増えるほどソースが醜くなるし
関数化しても複数プロジェクトで使うようになったら
あとで「これなにやってるんだっけ?」になってしまうこともあるからです
この先悩む数値演算は四捨五入じゃねーの?
ゲイさんが「超確実」と言っているのはこんな方法じゃないでしょうか。
sprintf( buf, %f, d );
p = strchr( buf, '.' );
*(++p) = '\0';
いいかどうかは別にして、こういう方法もあるよ、という意味で挙げられたのではないかと。
↑では小数点第1位を消しちゃってますね。
sprintf( buf, %f, d );
p = strchr( buf, '.' );
*(p+2) = '\0';
皆様、たくさんのご回答、ありがとうございます。
woodさんに教わった方法でいけました。
>この先悩む数値演算は四捨五入じゃねーの?
に関してなのですが
double dData = 812.65;
TRACE(%3.1f\n, dData);
dData = 123.45;
TRACE(%3.1f\n, dData);
とすると結果は
812.6
123.5
かたや、四捨五入、かたや切り捨てになっているようなので
切り捨てを採用してしまおうと思いました。
もし上記の出力が異なる理由をおわかりになるかたがいらっしゃいましたら
ご教授くださいませ。m(__)m
>もし上記の出力が異なる理由をおわかりになるかたがいらっしゃいましたら
>ご教授くださいませ。
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
isshi様
ありがとうございました。
(いまいち、納得できませんけど^^)
そういうものだとあきらめます。