質問: 2; if( b <= ( a * 0.2 ) ){ // 処理 }else{ // 処理 } ### 試したこと キャストを明確に記載せずに試したところ小数点を切り捨てることなく比較してくれたので 比較の際に自動的に大きい型にキャストしてくれるのかな?と勝手に思っているのですが まちがっていたら教えて頂きたいです。 ### 補足情報(言語/FW/ツール等のバージョンなど) Java8
回答: Javaの言語仕様で型変換されることが決まっているため不要です。 バージョン古いですが、日本語訳 > > ある演算子が 二項数値昇格(binary numeric promotion) をオペランドの対に適用するときは,個々のオペランドが,数値型の値を表さなければならないが,必要に応じてオベランドを変換するための拡大変換(5.1.2)を用いて,順番に次の規則を適用する。 > > > * 一方のオペランドが型 double ならば,他方を double に変換する。 > * そうでないときには,一方のオペランドが型 float ならば,他方を float に変換する。 > * そうでないときには,一方のオペランドが型 long ならば,他方を long に変換する。 > * そうでないときには,両オペランドを型 int に変換する。 > > 二項数値昇格は,特定の演算子のオペランドに関して実行する。 > * 乗法系の演算子,*,/ 及び % (15.16)。 > * 数値型加算演算子+ 及び減算演算子 -(15.17.2)。 > * 数値比較演算子 <,<=,> 及び >= (15.19.1)。 > * 数値等価演算子 == 及び != (15.20.1)。 > * 整数のビット単位の演算子 &,^ 及び | (15.21.1)。 > * 特定の場合における条件演算子 ? : (15.24)。 > > > 書き方だけの問題で認識はあっていると思いますが。。。 > > 変数aはif文内でDouble型になっていると考えて > > > 合っていますが、正しくは、`変数 a`はintのままで、`a * 0.2`がdoubleに拡大変換(5.1.2)されています。