税込価格を計算する
小数を掛けた答えは、int の箱に入らない
税抜き価格に消費税 10% を足すだけなら、電卓では一瞬です。ところが Java で書き始めると、最初の 1 行で止まります。整数に小数を掛けた瞬間、答えの型が変わってしまうからです。
Java は違う型どうしの計算では、結果を「小数を持てるほう」に揃えます。int と double を掛ければ、答えは double です。
Java
int listPrice = 1250;
int result = listPrice * 0.7; // incompatible types で止まる1250 * 0.7 は 875.0 という double なので、int の箱には入りません。int から double へは何も書かずに入りますが、逆の向きは小数が消える可能性があるため、Java は黙って通しません。「消えてもいい」と書き手が明示する必要があります。
(int) を前に置くと、小数が捨てられる
その明示が キャスト です。値の前に (int) と書くと、小数の部分を捨てて整数にします。
Java
int discounted = (int) (listPrice * 0.7); // 875
double avg = 7 / 2.0;
int floored = (int) avg; // 3.5 が 3 になる大事なのは、四捨五入ではなく切り捨てだという点です。3.5 は 4 ではなく 3 に、108.9 は 108 になります。0 に近いほうへ落ちる、と覚えてください。
カッコの位置にも意味があります。(int) (listPrice * 0.7) は「掛け算の結果全体を int にする」ですが、(int) listPrice * 0.7 と書くと listPrice だけが変換され、そのあと 0.7 を掛けるので答えはまた double に戻ります。変換したいまとまりをカッコで囲んでから (int) を付けてください。
possible lossy conversion from double to intというエラーは「小数が消えるけどいいのか」という確認です。意図どおりなら(int)を足す、意図と違うなら受け取る型をdoubleにする、のどちらかで直ります。
× 110 / 100 で済ませようとすると、ずれる
小数を避けて、整数だけで 10% を足す書き方も思いつきます。しかし int どうしの割り算は小数を捨てるので、値によって答えがずれます。
Java
int p = 5;
int wrong = p * 110 / 100; // 5.5 のはずが 5p が大きいうちは合っているように見えるのが厄介なところです。割合の計算では、素直に小数の係数を掛けてから最後に (int) で落とすほうが安全です。
もう 1 つ、掛ける数の取り違えにも注意してください。0.1 を掛けると出てくるのは消費税額そのもので、税込価格ではありません。税込を一度に出したいのか、税額だけ欲しいのかで係数が変わります。
やってみよう
taxIncluded(int price) を完成させ、税抜き価格から税込価格を int で返してください。
priceに消費税ぶんを含めた係数を掛ける- 掛け算全体をカッコで囲み、
(int)で整数に落とす - 実行して、
100が110、99が108になることを確かめる
99 の回が答え合わせの本番です。99 の税込は 108.9 なので、109 を返す実装は切り上げか四捨五入をしています。切り捨てになっているかどうかは、この 1 件で分かります。
要件
- Solution クラスに public static int taxIncluded(int price) を実装する
- price に消費税 10% を加えた金額を計算する (税込 = 税抜 × 1.1)
- 戻り値は int 型。小数点以下は切り捨てる (例: 99 → 108)
入出力例
taxIncluded(100) → 110
taxIncluded(1000) → 1100
taxIncluded(99) → 108
taxIncluded(0) → 0
taxIncluded(3980) → 4378