- ベストアンサー
どうしたらいいですか?
キーボードから入力された実数(double a)の少数第一位の値が5以上なら「切 り上げ」、4以下なら「切り捨て」と表示する。と同時に四捨五入した値を表示 する。ってどうやっらら良いですか? 整数なら10で割った値の余りを評価すれば良いですが、実数ではどうすれば良いですか? また、同時に表示するにはどうすれば良いでしょうか? さっきこの質問をし、回答をいただいたみたいなのですが、そのページか「見つからない」と言われ見る事が出来なかったので再度質問させていただきます。 宜しくお願いします
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
0.5と0.4の問題は10倍してから評価すればOKです。 また、四捨五入は0.5を加えてから整数に直してやればOKでしょう。
その他の回答 (2)
- ara_ara
- ベストアンサー率35% (124/348)
回答No.3
aを整数化した値nと、a+.5を整数化した値mを比較すればいいのではにでしょうか? ・n=mなら切捨て ・n+1=m(n<>m)なら切り上げ
質問者
お礼
ひとつの命令でも、色んなアプローチの仕方があるんですね。勉強になりました。 回答ありがとうござます。
- khurata
- ベストアンサー率40% (54/134)
回答No.2
Cの double型は内部的には 2進数ですので(ほぼ全ての処理系でそうなっているはずです)、小数を扱うと誤差が生じるケースがあるはずです。 なので、キーボードから入力された小数を数値ではなく、まずは文字列として受け取り、小数点の右側と左側をそれぞれ整数型に変換して、それぞれ独立した計算処理をするのが、より厳密で、理想に近い処理と言えます。 ただ、そこまでの精度が必要無ければ、#1の回答のように 10.0倍して処理すれば良いと思います。
質問者
お礼
まず文字式でやるという方法もあるんですか。又チャレンジしてみます!とりあえず今回は10倍で行こうと思います。 回答ありがとうございました。
補足
回答ありがとうございます。次のようなプログラムを作ったのですがうまく動きません。aの値をうまく読み込んでもらえません。違うところがありましたら指摘ください。 #include <stdio.h> int main (void){ double a,b,c; puts("少数第一位まで値を入力してください"); printf("値a:"); scanf("%.1lf",&a); b=10*a; c=a+0.5; int d=c; if((int)b%10>=5){ printf("切り上げです\n"); printf("四捨五入した値は%dです。\n",d); } else { printf("切り捨てです。\n"); printf("四捨五入した値は%dです。\n",d); } return (0); }