• 締切済み

doubleとintの違い

TALLY-HOの回答

  • TALLY-HO
  • ベストアンサー率29% (103/354)
回答No.1

簡単ですよ。「小数点が付くか、つかないか」です。 たとえば、ホームページのアクセス回数なんていうのは int型で定義するのが普通です。0回、1回、2回・・・ アクセス回数0.3回!なんていいませんよね。 ±にかかわらず、小数点が付かないのが「整数」。 逆に身長や体重はdouble型やfloat型で定義します。 “45.6kg”や“178.5cm”など小数点 がつくものが「実数」です。 どうして「数値型」という1つの型にまとめないのかは 内部処理の関係でして、双方メリットとデメリットが。 整数型(int系)は数値をそのまんま記憶してます。 そのため正確に値を記憶できますが覚えられる範囲が 非常に狭かったりします。(-32768~+32767など。 Javaのint型はこの何倍も大きいですが、やっぱり狭い) 実数型(double系)は数値を拡大or縮小して記憶しています。 そのために記憶している値が実際の値と微妙に違う、 「誤差」が発生するのです。累積するとかなりの 違いになってしまうため、金融システムなどでは 国際法で明確に定義してあります。 実際、実数型では「-1」を正確に記憶できません。 その代わり、覚えられる桁数がとても大きいのです。 int型:-2147483648 ~ 2147483647 = 約10桁 double型: .79769313486232e308 ~ .79769313486232e308 =約308桁 double型はint型の2倍のメモリを使いますが、 桁数は2倍どころじゃないですね。 このような点を理解して、プログラムする値が どんな数値でどれぐらいの範囲に収まるのかを考えて 使い分けましょう。

関連するQ&A

  • java 実数の割り算

    javaで簡単な整数と実数での四則演算のプログラムを作りました。 整数での計算はint型で実数はdouble型で作りました。 数値を10と3(10.0と3.0)にしたのですが、 整数では 10/3=3  となり 実数では 10.0/3.0=3.3333333333333335 となりました。 この違いはなんなんでしょう? 整数のほうはなんとなくわかるのですが、実数のほうはさっぱり・・・ いろいろ聞きまわって、64ビットで有効桁数が・・とは聞いたのですが理解できず・・ 教えてください!!

    • ベストアンサー
    • Java
  • int なぜ

    int balance[ ]={10.0,120,1.24}; は正しいらしいのですが, double balance[ ]={10.0,120,1.24}; と書くべきですよね? また int balance[ ]={10.0,120,1.24}; の場合は整数に直されて格納されるということでいいですか?

  • 数字の double 型 を int型 にする時

    仮に double 型 の ある数字を 12.6 とします。 printf関数を使って .0f で表示する時は 小数点を四捨五入されて 、整数地が1繰り上がり13と表示されます。 ここである数字をキャスト演算子を使ってprintfで表示すると小数点を切り捨てられるので12と表示されます。 これはdouble型では 12.6 がはいっていて int型では12がはいっているから起こる現象ですね。 前置きは長く長くなりましたがdouble型で四捨五入される数字を、int型にした時に1繰り上げる簡単な方法はないものでしょうか?  double a = 12.6;  int b = ( int ) a;  if( a - ( double ) b  > 0.4444444444 ){   b++;  }  printf( "%d\n" , b ); こういう方法なら一応出来ない事はないですがもっと簡単な方法はありませんか? 後、私は時間が余りないので時間内に回答がなければ返信が来週になります。 申し訳ありません。 答えていただいた方はありがとうございます。

  • 型について

    Cの型の中にint と long int がありますけどこの違いは何なのでしょうか?本にはどちらも4ビットの整数(long intは長整数となっていますが)-2147486648~2147483647となっていますが・・。 同様にdouble と long double は何が違うのでしょうか? 初歩的なところですがよろしくおねがいします。

  • int型とfloat型の演算結果

    C初心者です。 int型とfloat型で割り算をして処理を表示させてます。 以下、実処理の一部です。 int a; int b; a = 3; b = 2; (1) printf("答え=%d:1のはず\n",a/b); (2) printf("答え=%d:1のはず\n",a/(float)b); (3) printf("答え=%d:1のはず\n",(float)a/b); (4) printf("答え=%d:1のはず\n",(float)a/(float)b); 私の予想では(1)~(4)まですべて1が表示されると思っていました。 実際は(1)のみ1で(2)~(4)は0でした。 (2)~(4)はなぜ0と表示されるのですか? ・整数型と実数型で演算した場合、実数型に合わせられてること ・表示が整数型であること なので1が表示されると予想したのですが・・・。

  • int型での文字列の扱いについて

    整数はint型、文字はchar型を使うのが原則のようですが、 文字はコンピュータの中で数字で扱われていることと、 char型が0~255、int型がそれ以上の範囲の数字を扱えることを考えると 文字を扱う時もint型でかまわないのでは?と思いました。 実際、int型で1文字出力できました。具体的には下です。 int a; a=getchar(); printf("%c\n",a); return 0; しかし、文字列をint型で扱おうとすると、コンパイル時にエラーとなります。 int a[50]="Hello"; printf("%s\n",a); return 0; なぜ、int型では文字列が扱えないのか理解できません。

  • getId()がint?

    androidプログラミングを勉強中です。教本の中で、 メンバ変数 private int mOp; と定義し、 クリックイベントのメソッド内にて mOp = view.getId(); としています。 さらに別のクリックイベント内にて switch (mOp) { case R.id.button_plus: [処理] としています。 やりたい事は理解できるのですが、getId()がなぜintで定義されているのかわかりません。 getId()で取得できるのがR.id.button_plusならばString型ではないのでしょうか? intだとするとどんな整数が入っている事になるのでしょうか? 根本的に勘違いをしているのかもしれません。 おわかりになる方がいらっしゃいましたらお教え頂けると幸いです。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • int とcharの使い方と違い

    教えてgooに投稿するのは初めてですがよろしくお願いします。 最近C言語を勉強し始めた初心者です。 ネットのサイトを見て独学でしています。 過去スレッドをさらっと見て聞きたいことが書いてなかったので投稿します。(同じスレッドがあったらすみませんOTL) #include<stdio.h> int main(void) { int str='a'; printf("str=%c\n",str); return0; } この上のプログラムでは str=a と出て、エラーが出ずにコンパイル出来ました。でも、 #include<stdio.h> int main(void) { int str[]="abc"; printf("str=%s\n",str); return0; } とするとエラーが出ます。 int とcharの使い方と違いについて詳しく教えてほしいです>< お願いします。

  • int rev_int(int num)文  関数の入門

    #include<stdio.h> /*---非負の整数を読み込んでます*/ int scan_uint(void) //関数scan_uintは、キーボードから非負の整数値を読み込んでその値を返す関数です。 { //この関数には受け取るべき仮引数がありません。仮引数がないことを示すためには()の中をvoidとします。 int tmp;//テンプの箱作成 do { printf("非負の整数を入力してください:"); scanf("%d", &tmp); if (tmp < 0) printf("\a負の数を入力しないでください"); } while (tmp < 0); return (tmp); } /* 非負の整数を逆転した値を返す */ int rev_int(int num) { int tmp = 0; if (num > 0){ do { tmp = tmp * 10 + num % 10; num /= 10; }while (num > 0); } return (tmp); } int main(void) { int nx = scan_uint(); printf("反転した値は%dです。\n", rev_int(nx)); return 0; } 教えてください!参考書に書いてあることをまとめて プログラムを読んでるのですが、わからない部分があります。 (1)まずint scan_uint(void)からこのプログラムは読み込んでるのでしょうか? どこかのサイトを調べたら、最初にint mainからプログラムは 読み込むというのを観たのですが、コンパイルして実行した動きをみるかぎり一番最初はint scan_uint(void)から読んでるように見えます。。。 (2)int scan_uint(void)の文は理解できました。私なりに解釈したのは ここでは正の数を入力しないと次に進まないことと 負の数を入力した場合、負の数を入力しないでくださいと注意がずっと でるという文です。 質問ですが、このあとint rev_int(int num)文に移ると思うのですが ここの int tmp = 0; これはこのint rev_int(int num)文のみの tmpの箱と参考書に記載がありました。つまり int scan_uint(void)で 出てきたtmpとは別個と解釈しました。 そうなると、int rev_int(int num)文を読んでみると tmpの箱を作成。そこは0を代入。 if文で num>0の時、 do文に入る (ここでいうnumは int numと宣言してないですけど、またscanfとか作って値はまだいれてないですけど??) do文は tmp = tmp*10 + num %10 num /=10 wile(num>0) これを見る限り、numという箱が見えません。全体を見渡しても どこかでnumに値が代入されたのち、このint rev_int(int num) という文を読みこんでいき if num>0のときと宣言されていますが もっと前の段階でnumの値が入力されていない限り このif文は適用されないと思ったのですが、プログラムは動いてます 三つ目の質問です tmp = tmp *10 + num % 10 num /=10 の部分がわかりませんでした。 tmpはまず、int scan_uint(void)で作成したtmpと int rev_intで登場してきたtmpとは別個と参考書に書いてあるのが 正しいのであれば tmpの値はここでは初のはずです。 一体いつ値を入力したのでしょうか? もしも一番最初のscanfの時に入力した例えば12345が此処でも適用されるなら tmp = 12345 ×10 + num % 10を tmpに代入するって文になりますが どうしてtmpを10かけるのですか?123450になり、 そのあとnumの値が此処でもまだ不明なのですがnum/10したものと 足すみたいですが、わかりませんでした。。。 まとめると、tmp = tmp*10+num%10がわかりません。 また、numとは何かわかりません、値もどの値がどこで代入されていて while(num>0)が引っかかるのか不明です。 tmpはint scan_uint文内で入力した値(scanfの部分で) 12345と仮に入力したら、それは次のint rev_int(int num)でも続いて活用されてるのですか? 参考書はなぜ別個と書いてるのかわかりません。 ごめんなさい>_< とても長くなりました。 どなたか解る方、教えてください、よろしくおねがいします。

  • char型にint型の数値を代入する。

    たとえば、 int num; char box;  numに何らかの整数値が入っているときに、そのnumの中に入っている値をchar型に文字列として代入したいときはどのようにすればいいのでしょうか?