プロが教える店舗&オフィスのセキュリティ対策術

あるC言語の問題で答えを「小数第二位まで正確に 出力してください」とありました

他の正解を貰った回答者の解答を見ると
printf("%.2f\n", n);
と出力してprintfで小数点を調整してるだけでした。
(nの値はまだ四捨五入していない状態)

1
これは問題文の「正確に」に対して正しいものなのでしょうか?

2
自分でnに値を代入してやってみましたが
0.225を出力すると0.23で確かに四捨五入
0.125を出力すると0.12と切り捨てになります
これどういうものなのかも良くわかりません
この説明もお願いします

質問者からの補足コメント

  • 2の結果を見る限り正確な四捨五入ではないように思いますが「正確に」という質問に対して正解を出しています。
    その辺を説明お願いします

      補足日時:2019/06/20 11:04

A 回答 (8件)

0.125は浮動小数点で正確に誤差なく表せる数ですが


0.12となるのは偶数丸め(Nearest to Even)を採用しているからです。
C99で規定している標準の丸め方法のひとつ。
#丸め方法はC99では複数の方法から選べる
#規定値は決まって無かったと思うけど
#たいていは偶数丸め。

偶数丸め、銀行家の丸め などで検索してみましょう。

因みにC99では丸め方法として四捨五入は採用していません。
またJISでも四捨五入は非推奨、偶数丸めを推奨しています。
    • good
    • 0

プログラムの世界では


「小数」が「正確」に表現できるとは限らない
というのが常識です.

それを前提にすると
そもそも「正確」とはどういうことですか?
という疑問が出てくるのは当然だと思いますよ.

ちなみに
round(n*100)/100
にしろ
(double)(int)(n*100+0.5) /100
にしろ, 負の数がからむといわゆる四捨五入にはならないことがありえますね. まあ「四捨五入ってなんだ」っていわれるとやっぱり困るんだけど.
    • good
    • 0

整数型以外は全て誤差を含んでいると理解していいと思います。


「小数第二位まで正確に 出力してください」
というのであれば、1000倍して整数にして、下1桁を四捨五入するのではダメですか?

>0.125を出力すると0.12
代入した0.125を1000倍して125になっているか確認してみてください。
    • good
    • 0
この回答へのお礼

回答有り難うございます

round(n*100)/100
or
(double)(int)(n*100+0.5) /100(
こうすれば学校で習うところの小数点第3位の四捨五入が「正確」に出せ少数第2位が出ますよね?
まだ中学生なのでその辺よくわからないのですがプログラミングの世界では正確にというのは学校で習う正確とはちがうのですか
「正確」にで少し混乱してしまいました

お礼日時:2019/06/22 19:17

#4 の補足要求に


4. どのようなプログラムで確かめたのですか
も入れておきましょうか.

ちなみに「小数第二位まで正確に 出力してください」自体に複数の解釈がありえるし, 仮に四捨五入としても複数の方法があるので
正確な意図を確認する
のが最も適切だと思いますよ. それが面倒なら
自分の解釈を示したうえでその解釈に対して適切なプログラムを示す
のもありえますが, その場合には
出題者の気分で「ダメ」とされても文句はいいにくい
ので注意が必要ですね.
    • good
    • 0

>自分でnに値を代入してやってみましたが


>0.225を出力すると0.23で確かに四捨五入
>0.125を出力すると0.12と切り捨てになります。

補足要求です。
1.nの型はなんですか。doubleですかfloatですか。どちらでしょうか。
2.コンパイラは何でしょうか。gccですかvisual studioですか。それとも、なにか他のものでしょうか。
3.OSはwindowsですか。それともlinuxですか。
    • good
    • 0

>言葉遊びのレベルということ?


いや、言葉遊びではないですけど

>意味がわからないような問題では問題として意味をなさなくないですか?
はい、だからこの問題を出されたら私はまず
「正確に」とはどういう意味ですか?と質問しますね
    • good
    • 1

>これは問題文の「正確に」に対して正しいものなのでしょうか?


「正確に」の定義が少数第二位以降の数字を絶対に表示せずに
という意味なら正しいのでは
問題文だけでは「正確に」というのが何を示しているのかがわからないです

>これどういうものなのかも良くわかりません
https://www.cc.kyoto-su.ac.jp/~yamada/programmin …
非常にややこしい部分の話しです
詳しいことは「浮動小数点」「丸め誤差」など
ご自身で検索して調べたほうが良いと思います

とりあえずイメージしやすいように
分かりやすいように以下のURLの実行結果を見てください
https://wandbox.org/permlink/mATyXJ7zti5HJ4wV
0.225という数字をコンピュータでは正確に表すことができないことがわかると思います
コレが精度の問題です
    • good
    • 0
この回答へのお礼

>「正確に」の定義が少数第二位以降の数字を絶対に表示せずにという意味なら正しいのでは
>問題文だけでは「正確に」というのが何を示しているのかがわからないです

え?
言葉遊びのレベルということ?
意味がわからないような問題では問題として意味をなさなくないですか?

お礼日時:2019/06/20 11:14

1 出題者の意図通りだと思います。


2 printfの仕様です。
    • good
    • 0
この回答へのお礼

説明できる方の回答をお待ちしております

お礼日時:2019/06/20 11:01

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

このQ&Aを見た人はこんなQ&Aも見ています


人気Q&Aランキング