![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_16.png?5a7ff87)
No.9
- 回答日時:
#include <stdio.h>
int main(void)
{
int a = 5 / 3;
double b = 5.0 / 3.0;
printf("%d\n", a);
printf("%f\n", b);
}
====
これをコンパイル・リンクして実行すると、
1
1.666667
あたりが出力されると思います。%f のデフォルトの有効桁が 6 なのでこのようになります。たとえば、printf("%.15f\n", b) などと有効桁を 15 にすると、1.666666666666667 と長くなりますが、あまり長くしても、所詮、有限ビットで計算しているので、正確な数値になるとは限りません。
整数型(int など)の変数で割り算をすると、小数点以下が切り捨てられます。浮動小数点型(doubule など)の変数で割り算をすると、小数点以下の切捨ては行われません。ただし、C言語の double などは、ビット数が固定なので、無限小数は扱えません(たぶん、お使いの電卓でもそうだと思います。有理数の計算ができる電卓なんかは別でしょうけど)。
あと、表示の際に指示されている有効桁で表示するため値が丸められる(四捨五入)のと、計算の際にビット数の不足から値が丸められることがあるということを認識しておくといいと思います。
以下のURLなどに、浮動小数点型の説明があるので、興味があれば、ご覧になるとよろしいかと思います。
http://www.cc.kyoto-su.ac.jp/~yamada/programming …
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_16.png?5a7ff87)
No.8
- 回答日時:
すでに回答されていますが、整数同士の割り算は切り捨てがおこりますし、
printf() の %d で double を出力しようとされているからでしょうね^^
=====
#include <stdio.h>
int main(void)
{
int a, b, rv = 0;
if (scanf("%d%d", &a, &b) != 2) {
rv = 1;
} else if (b == 0) {
fprintf(stderr, "zero divided\n");
rv = 2;
} else {
printf("%g\n", (double)a / b);
}
return rv;
}
この回答への補足
5÷3を計算したら1.66667 と出ましたが、これも切り捨てられていることになるんでしょうか? 電卓では1.6666・・・の6が無数に並ぶんですが。 実行結果の7は四捨五入した値ですか?
補足日時:2007/08/22 20:35No.7
- 回答日時:
★回答ではなく返信(補足要求)
>秀和システムの「C言語のe本」を買いました。
↑
どうですか?
イラストが多いようですけど変数の『宣言』『for文』とかの解説は分かりやすかったですか?
>初心者からすると、キャストはかなり進んだ内容ですか?
↑
変数の宣言、型のサイズと役割が理解できていれば『初心者』でもすんなりと分かると思います。
私が最初に買った本では第1~18章まであり、キャスト演算は第5章、第8章で登場します。
そこには今回の質問とほぼ同じ内容で
>int a=5, b=2;
>double f;
>
>f = a/b; …fは2になる
>f = (double)a/b; …fは2.5になる
という説明が載っています。
他にも文章での説明がありますが省略します。
・この本では第5章、第8章の前に
(1)用語と知識
(2)定数
(3)データ型
(4)配列と文字列
★(5)型変換 ←初登場!キャスト演算
(6)記憶クラス
(7)初期化
★(8)演算子 ←2度目のキャスト演算
(9)制御文
(10)ポインタ
(11)関数
(12)構造体
(13)ビットフィールド
(14)共用体
(15)プロプロセッサ
(16)コンソール入出力
(17)入出力以外の標準関数
(18)ファイル処理関数
と続きます。
・つまり『キャスト』演算はかなり最初に登場する基本です。
>初心者からすると、キャストはかなり進んだ内容ですか?
↑
私の持っている本では制御文(for,while,if,else)よりも最初に登場します。
だから初心者が最初に理解しておくべき内容だと思います。
決して進んだ内容ではないでしょう。
・逆にキャスト演算よりも制御文(for,while,if,else)の方が進んだ内容だと思います。
やはり基本のデータ型と型変換(キャスト)は先に理解しておきたい内容ですね。
最後に:
・買った本(C言語のe本)でもキャストはかなり最初に登場しませんか?
もしも最初のページに書かれているのなら初心者さんが最初に学ぶべき事柄となります。
どんな感じで解説されているかは分かりませんがデータ型と型変換はしっかりと
理解しておきたい項目です。それでは頑張って下さい。
・以上。→ちなみに『キャスト』は理解できましたか?
No.6
- 回答日時:
★キャストすれば。
もう回答があるが…。>n=a/b;
↑
ここを『n=(double)a/b;』にします。
>実行しても、a、bに何を入れても0になっていしまいます。どこが違っているでしょうか?
↑
a=1、b=1 なら n=1 になりませんか?
または a=12345、b=1 なら n=12345 になると思いますが…。
多分は分母の b の数が a よりも大きいのでしょうね。
小数の表現となっているので。
※上記のことは既に回答者 No.1 さん~No.4 さんの回答通りです。
★もう一つの方法
>1以上の自然数を2つ(それぞれa,b)読み込み、
↑
という事なので a、b も int 型ではなくて double 型で宣言してみるのはどうですか。
つまりは
int main( void )
{
double a, b, n;
// 小数を入力しないと条件をつける
printf( "必ず整数を入力して下さい:" );
scanf( "%lf %lf", &a, &b );
// 計算
n = a / b;
// 表示
printf( "a/b = %f\n", n );
return 0;
}
とこんな感じでも出来そうです。
もし int 型の整数で入力することを前提としているのなら、やっぱキャスト演算して下さい。
・キャストに関しては
http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.4 …
を読んでみて下さい。
・あと C 言語の本は用意しましたか?
しっかりとした本を一冊用意した方が良いですよ。
・以上。
No.5
- 回答日時:
最近何度か指摘していますが、printf系関数におけるdouble型の書式は %lf ではなく %f です。
%lf を使えるのはC99だけです。
http://seclan.dll.jp/c99d/c99d08.htm#dt19991115
http://www.kijineko.co.jp/tech/superstitions/pri …
No.4
- 回答日時:
> a、bに何を入れても0になっていしまいます。
そんなはずはありません。
a > b となるような数値、例えば2と1を入力してみてください。
小数を表示させたいなら、
n = (double)a/b;
printf("%f", n);
とします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C++で外積
-
至急です! マクロ定義で #defi...
-
先程の質問で教えていただき、...
-
C言語
-
C言語を実行すると-infが出てき...
-
(C言語)ニュートン法のプログ...
-
Cで3乗根を求める方法
-
C言語 関数プロトタイプ宣言の...
-
float型とdouble型の変数の違い...
-
C#、太らせた多角形を塗りつぶ...
-
はさみうち法のプログラム(C言...
-
-1.#IND00と出てしまうのですが...
-
数値を指数部と仮数部に分離したい
-
2つの式
-
1以上の自然数を2つ(それぞれ...
-
急!【ヒストグラムのプログラ...
-
C言語でのsinxのマクローリン展...
-
vc++expreeで作ったdllをvbaで使用
-
3次方程式の求解プログラム(...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
doubleの変数にintとintの割り...
-
float型とdouble型の変数の違い...
-
c言語で、繰り返し文の中で、0....
-
C言語を実行すると-infが出てき...
-
C言語 関数プロトタイプ宣言の...
-
C 開放してるのにエラー(doubl...
-
C言語の型による処理速度の違い
-
至急です! マクロ定義で #defi...
-
関数におけるif文とreturn文に...
-
c言語のプログラミングについて...
-
2分法で方程式の複数の解を自...
-
-1.#IND00と出てしまうのですが...
-
doubleは常に%lfとするべきなのか
-
C言語のpow関数の不具合
-
C言語で-23乗を取り扱うには
-
C言語で台形公式を使った二重積...
-
Cで3乗根を求める方法
-
2次方程式の解を求めるプログ...
-
sin(x)の近似について
おすすめ情報