回答:
2つのオペランド(1と3)は整数であるため、整数演算(ここでは除算)が使用されます。結果変数をdoubleとして宣言すると、除算後に暗黙の変換が発生します。
もちろん整数除算は、ゼロに向かって丸められた除算の真の結果を返します。0.333...
したがって、ここでは0に切り捨てられます。(プロセッサは実際には丸めを行いませんが、そのように考えることもできます)。
また、両方のオペランド(数値)が浮動小数点として指定されている場合も注意してください。3.0と1.0、または最初の場合でも、浮動小数点演算が使用されます0.333...
。
1/3
両側が整数であるため、整数除算を使用します。
float
またはになるには、少なくとも1つ必要double
です。
質問のようにソースコードに値を入力する場合は、次のようにできます1.0/3
。これ1.0
はダブルです。
他の場所から値を取得する場合は(double)
、をにint
変換するために使用できますdouble
。
int x = ...;
int y = ...;
double value = ((double) x) / y;
あなたは使うべきです
double g=1.0/3;
または
double g=1/3.0;
整数除算は整数を返します。
JAVAでの変換は非常に簡単ですが、ある程度の理解が必要です。整数演算のJLSで説明するように:
シフト演算子以外の整数演算子に少なくとも1つのlong型のオペランドがある場合、演算は64ビット精度を使用して実行され、数値演算子の結果はlong型になります。他のオペランドがlongでない場合、最初に拡張され(§5.1.5)、数値の昇格(§5.6)によってlongと入力されます。
そして、例は常にJLSを翻訳する最良の方法です;)
int + long -> long
int(1) + long(2) + int(3) -> long(1+2) + long(3)
それ以外の場合、演算は32ビット精度を使用して実行され、数値演算子の結果はint型になります。いずれかのオペランドがintでない場合、まず数値昇格によってintと入力するように拡張されます。
short + int -> int + int -> int
Eclipseを使用して2つshort
のを追加してもそれほど簡単ではないことを示す小さな例:
short s = 1;
s = s + s; <- Compiling error
//possible loss of precision
// required: short
// found: int
これには、精度を失う可能性のある鋳造が必要になります。
同じことが浮動小数点演算子にも当てはまります
数値演算子の少なくとも1つのオペランドがdouble型の場合、演算は64ビット浮動小数点演算を使用して実行され、数値演算子の結果はdouble型の値になります。他のオペランドがdoubleでない場合は、最初に拡張され(§5.1.5)、数値の昇格によるdouble型(§5.6)になります。
したがって、プロモーションはフロートからダブルに行われます。
そして、整数値と浮動小数点値の両方が混在すると、前述のように浮動小数点値になります
2項演算子のオペランドの少なくとも1つが浮動小数点型である場合、もう一方が整数であっても、演算は浮動小数点演算です。
これは、二項演算子には当てはまりますが、「代入演算子」には当てはまりません。 +=
簡単な作業例でこれを証明するには十分です
int i = 1;
i += 1.5f;
ここで行われる暗黙のキャストがあるため、これは次のように実行されます
i = (int) i + 1.5f
i = (int) 2.5f
i = 2
これを試してください:
public static void main(String[] args) {
double a = 1.0;
double b = 3.0;
double g = a / b;
System.out.printf(""+ g);
}
「double g = 1.0 / 3.0;」を実行します 代わりに。
他の多くは本当の問題を指摘することに失敗しました:
整数のみに対する演算は、演算の結果を整数にキャストします。
これは、整数として表示される可能性のある浮動小数点の結果が切り捨てられることを意味します(小数部を切り捨てます)。
何をしているキャストと尋ねる(型キャスト/型変換)?
言語の実装によって異なりますが、ウィキペディアにはかなり包括的な見解があり、強制への回答も含まれています。これは、質問への回答において極めて重要な情報です。
1/2
ターゲット言語(java)ではなく、のようなすべての整数デビジョンに関与する型キャストまたは型変換はありません。整数除算を呼び出すだけで、結果は整数になります。型キャストは、割り当て中にからint
へのアップコンバージョンが原因ですdouble
。
0.5
。単に、Javaでは1/2
、整数除算であり、ゼロの整数になります。doubleにゼロを割り当てることができますが、doubleであってもゼロのまま0.0
です。
int i = .99999999
intを0に設定します。より具体的には、整数部分を取り、残りを破棄します。