私はこのコードを書いていました:
public static void main(String[] args) {
double g = 1 / 3;
System.out.printf("%.2f", g);
}
結果は 0 です。これはなぜですか?また、この問題を解決するにはどうすればよいですか?
私はこのコードを書いていました:
public static void main(String[] args) {
double g = 1 / 3;
System.out.printf("%.2f", g);
}
結果は 0 です。これはなぜですか?また、この問題を解決するにはどうすればよいですか?
2 つのオペランド (1 と 3) は整数であるため、整数演算 (ここでは除算) が使用されます。結果変数を double として宣言すると、除算後に暗黙的な変換が発生するだけです。
もちろん、整数除算は、ゼロに向かって丸められた除算の真の結果を返します。したがって、ここでは の結果は0.333...
0 に切り捨てられます。(プロセッサは実際には丸めを行わないことに注意してください。ただし、そのように考えることができます。)
また、両方のオペランド (数値) が float として指定されている場合にも注意してください。3.0 と 1.0、または最初の0.333...
.
1/3
両辺が整数であるため、整数除算を使用します。
少なくとも 1 つがfloat
またはである必要がありdouble
ます。
質問のようにソースコードに値を入力している場合は、次のことができます1.0/3
。は1.0
ダブルです。
他の場所から値を取得する場合は、 を に変換するために使用(double)
できint
ますdouble
。
int x = ...;
int y = ...;
double value = ((double) x) / y;
明示的にキャストするdouble
double g = 1.0/3.0
これは、Java が と を整数定数として入力したため、整数除算演算を使用するために発生し1
ます3
。
整数除算を行っているためです。
@Noldorin が言うように、両方の演算子が整数の場合、整数除算が使用されます。
結果 0.33333333 は整数として表すことができないため、整数部分 (0) のみが結果に割り当てられます。
演算子のいずれかがdouble
/のfloat
場合、浮動小数点演算が行われます。しかし、そうすると同じ問題が発生します。
int n = 1.0 / 3.0;
あなたが使用する必要があります
double g=1.0/3;
また
double g=1/3.0;
整数除算は整数を返します。
1 と 3 は整数定数であるため、Java は整数除算を行い、結果は 0 になります。倍精度定数を書きたい場合は、and と書く必要が1.0
あり3.0
ます。
1 と 3 を整数として扱い、結果を 0 に切り捨てて整数にするためです。
探している結果を得るには、次のように数値が double であることを Java に明示的に伝えます。
double g = 1.0/3.0;
1 を float にすると、float 除算が使用されます
public static void main(String d[]){
double g=1f/3;
System.out.printf("%.2f",g);
}
public static void main(String[] args) {
double g = 1 / 3;
System.out.printf("%.2f", g);
}
1 と 3 は両方とも int であるため、結果は丸められず、切り捨てられます。したがって、分数を無視して、全体のみを取ります。
これを避けるには、数字の 1 または 3 の少なくとも 1 つを小数形式の 1.0 および/または 3.0 にします。
他の多くの人は、本当の問題を指摘できませんでした:
整数のみの操作は、操作の結果を整数にキャストします。
これは必然的に、整数として表示される可能性のある浮動小数点の結果が切り捨てられることを意味します (小数部分が切り取られます)。
あなたが尋ねるキャスト(型キャスト/型変換)とは何ですか?
言語の実装によって異なりますが、ウィキペディアにはかなり包括的な見解があり、強制についても言及されています。これは、質問に答える上で重要な情報です。
「double g=1.0/3.0;」を実行します。代わりは。