私のコードでは、出力は 2.000000 ですが、2.11111 であるはずです
#include<stdio.h>main(){
int i,j;
float r;
i = 19;
j = 9;
r = i / j;
printf(" %f ",r);}
なぜ機能しないのですか?
私のコードでは、出力は 2.000000 ですが、2.11111 であるはずです
#include<stdio.h>main(){
int i,j;
float r;
i = 19;
j = 9;
r = i / j;
printf(" %f ",r);}
なぜ機能しないのですか?
i / j
は整数除算だからです (両方のオペランドが整数です) 。結果を に格納しても違いはありませんfloat
。
i
とのいずれかj
が floatの場合、目的の結果が得られます。たとえば、次のようになります。
r = ((float)i) / j;
変化する
r = i / j;
と
r = i / (float) j;
i
とj
は整数で、i / j
は整数除算です。
これは、除算が a に割り当てられる前に整数で行われるためfloat
です。とのタイプを変更しi
てj
修正float
します。
main(){
float i,j,r;
i = 19;
j = 9;
r = i / j;
printf(" %f ",r);
}
または、次のように部門でキャストi
することもできます。float
r = ((float)i) / j;
は整数除算 (両方のオペランドが整数) であるためi / j
、それらの除算の結果は整数 (小数部分は破棄されます) になり、これが float 型の変数に再び割り当てられるため、コンパイラは整数の結果を再びr
型キャスト (つまり、暗黙的な型キャスト)します。 float
2.000000 を表示
i と j のいずれかが float の場合、目的の結果が得られます。たとえば、次のようになります。
r = ((float)i) / j;
//明示的な型キャスト
2つの整数をダイビングすると、整数がワイルドになります(あなたの場合、2
後で浮動小数点数に変換されます):
i
orを floatに変換するだけj
です (または、最初に float として宣言します):
r = ((float) i) / j;
ここで、int は、RHS (整数除算、デフォルトでは商 = 整数) が評価された後、デフォルトで float に変換されました。そのため、2.000000 が得られます。RHS で任意の数値を型キャストして、求める結果を取得します。
c で型変換を理解してからキャストする必要があることを確認してください。適切なソースでそれらを確認してください。一般に、自動変換は、情報を失うことなく狭いオペランドを広いオペランドに変換できるものです。たとえば、float + integer (64 ビット マシン上) などの例で整数を浮動小数点に変換します。[wiki より]。
例 float x =7.8 ; int k=9; int j = k + x = 16 .
ここでは、最初に k が float に変換され、次に加算され、最後に結果が整数に切り捨てられます。