税込価格を計算する

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

税込価格を計算する とは

税抜き価格を受け取り、消費税 10% を加えた税込価格を整数で返すメソッドを書いて、算術演算と型変換の基礎を体に馴染ませる。

算術演算を実戦で使ってみる

前回のレッスンでは、Java の 5 つの算術演算子 + - * / % を一気に紹介しました。足し算 +、引き算 -、掛け算 *、割り算 /、そして「余り」を求めるあまり演算子 % の 5 つです。それぞれの記号がどんな計算をするかは、紙の上で 1 + 1 や 7 / 2 を計算するのと同じ感覚で理解できたと思います。

しかし、文法を「知っている」ことと、それを「使える」ことの間には大きな川があります。たとえばあなたが新しく作った EC サイトで、商品の税抜き価格を入力すると税込価格を画面に表示したいとします。このとき、頭の中で 99 円 × 1.1 = 108.9 円 と計算するのは簡単ですが、それを Java のコードに落とし込むとなると、急に「あれ、1.1 を掛けたら戻り値の型は何になる?」「108.9int に入れたら小数はどうなる?」といった疑問が湧いてきます。

このレッスンのテーマは、机上の算術演算子を実用の場面に橋渡しすることです。「消費税 10% を加えて税込価格を返す」という、誰もが日常で目にする計算を題材にして、Java の型と算術演算がどう絡み合うかを体感していきます。

身近な題材だからこそ、出力の正しさが直感でチェックできます。100 円なら 110 円、1000 円なら 1100 円。これがズレていれば即座に「あれ、おかしい」と気付けます。プログラミングの学習では、こうした「自分で答えを検算できる課題」を選ぶことがとても大事です。

消費税 10% を加える計算式

税抜き価格を price、税込価格を total とすると、計算式は下記のとおりです。

プレーンテキスト

total = price × 1.1

たとえば price100 円なら、100 × 1.1 = 110 円。price1000 円なら 1000 × 1.1 = 1100 円。素直な掛け算 1 回で終わります。これを Java のメソッドにすると下記のような書き出しになります。

Java

public class Solution { public static int taxIncluded(int price) { // ここで price に 1.1 を掛けて、その結果を int で返したい return 0; } }

メソッド名は taxIncluded、引数は int price の 1 つ、戻り値の型は int です。中身を埋めるだけなのですが、ここに 1 つだけ落とし穴があります。int × 1.1 を計算した結果は、int ではなく double (小数を扱う型) になるという Java のルールです。

Java は型に厳しい言語です。intdouble のように違う型を混ぜて計算したとき、結果の型は「より大きい方」に自動で揃えられます。int * double の結果は doubledouble + int の結果も double になります。これは将来何度も出会う重要なルールです。

整数と小数が混ざるとどうなるか

もう少し具体的に考えてみましょう。price = 100 のとき price * 1.1 を計算すると、結果は 110.0 という double 値になります。110 ではなく 110.0、つまり「小数を持てる型」として扱われます。これをそのまま int 型の戻り値として返そうとすると、コンパイラはこう言います。

doubleint に入れるなら、情報が削れる可能性があるのを承知の上で、はっきりとそう書いてください」

つまり Java は、情報が失われる可能性のある代入を 暗黙的には許してくれませんint → double (情報が増える方向) は何も書かずに OK ですが、double → int (情報が削れる方向) は明示的な指示が必要です。この指示のことを キャスト (型変換) と呼び、(int) のように丸カッコで型名を書きます。

たとえば下記のとおりです。

Java

public class Solution { public static int taxIncluded(int price) { double withTax = price * 1.1; // double 型になる (例: 108.9) int result = (int) withTax; // int にキャスト → 108 return result; } }

この (int) withTax の部分がキャストです。double で受け取った withTax を「明示的に int に変換する」という意思表示で、結果として 小数点以下が単純に切り捨てられます108.9 なら 108110.0 なら 1100.0 なら 0 です。

もう少し短く書くこともできます。下記のような 1 行版もよく使われる書き方です。

Java

public class Solution { public static int taxIncluded(int price) { return (int) (price * 1.1); } }

price * 1.1 を丸カッコで囲んでから (int) を前に置くと、「計算結果全体を int に変換してから返す」という意味になります。短くて読みやすいので、慣れてきたらこちらの形が定番です。

キャストの詳しい仕組み (何が起きているのか、どんな種類があるか、(double) で割り算するときの注意点など) はあとのレッスンで深掘りします。ここではまず「(int) を頭に付けると小数が切り捨てられる」と覚えれば十分です。

計算の流れを図で追う

taxIncluded(99) を例に、データが何をどう流れていくかを下記の図で確認します。

diagram (will load when visible)

int99double1.1 を掛けた瞬間、答えは double の世界に引き上げられ、108.9 という小数を持ちます。そこから (int) のキャストで int の世界に戻ってくるとき、.9 の部分が問答無用で切り捨てられて 108 になります。これがこのレッスンの中心的な流れです。

よくある間違い

ここまでで「概念は分かった」と思っても、実際に手を動かすとつまずきポイントが出てきます。下記の 3 つは、ほぼ全員が一度はやらかすミスです。

1 つ目は、1.1 ではなく 0.1 を掛けてしまう こと。0.1 は「消費税の額」を計算するための係数で、税込み価格そのものではありません。100 * 0.1 = 10 は消費税ぶんの 10 円であって、税込み価格の 110 円ではない、という違いに気付くことが大切です。税込み価格を一発で求めたいなら係数は 1.1、税額だけ別途求めたいなら 0.1 を掛けて足す、と使い分けます。

2 つ目は、整数同士の割り算で小数が消えてしまう ミスです。たとえば price * 110 / 100 のように書いて 10% を計算しようとすると、これは整数だけの計算なので、Java/整数除算 になり、小数点以下が問答無用で切り捨てられます。99 * 110 / 10010890 / 100 = 108 (整数の世界では 108.9 ではなく 108) なので、たまたま今回は同じ答えになりますが、price = 5 のような小さな値だと 5 * 110 / 100 = 5 (本当は 5.5 のはず) のようにズレてきます。整数で正確に計算したい場面以外では、1.1 のような小数係数を使う方が安全です。

3 つ目は、キャストを忘れて intdouble を入れようとする こと。int result = price * 1.1; と書いてしまうと、コンパイラに「doubleint に入れたいなら明示してください」と怒られます。エラーメッセージは英語で incompatible types: possible lossy conversion from double to int と出ます。「possible lossy conversion (情報が失われる可能性のある変換)」というキーワードを見たら、(int) のキャストが必要だと思い出してください。

4 つ目のおまけのミスとして、return price + 1.1; のように 掛け算と足し算を取り違える パターンもあります。+ 1.1 だと「price に 1.1 円足す」になってしまい、消費税の意味が変わります。実装する前に、紙に 100 → 110 1000 → 1100 のような数値例を 2 〜 3 個書き出しておくと、こうした記号ミスにも気付きやすくなります。

やってみよう

それでは課題に挑戦しましょう。下記の手順で進めると詰まりにくいです。

  1. 右側のエディタで starter_code を開く
  2. return 0; を消し、return (int) (price * 1.1); の 1 行に書き換える
  3. 実行ボタンを押して、テストがすべて緑になることを確認する

うまくいったら、下記のような書き換えを試して挙動を比べてみましょう。intdouble の世界を行き来する感覚が身についてきます。

  • double withTax = price * 1.1;int result = (int) withTax; の 2 行に分けて書いてみる
  • (int) を外して return price * 1.1; と書くと、どんなエラーが出るか観察する
  • 試しに 1.11.08 に変更して、消費税 8% 版を作ってみる (テストは fail しますが、エラー画面の読み方の練習になります)
  • 税額だけを返す return (int) (price * 0.1); を試して、100 → 10 1000 → 100 になることを確かめる

小さなメソッドですが、ここで触れた「int * doubledouble になる」「double → int(int) で切り捨てる」というルールは、これから先に書くあらゆる数値計算で繰り返し顔を出します。今このタイミングで体に馴染ませておくと、後のレッスンがぐっと楽になります。一緒に進めていきましょう。

よくある質問

Q. Java と他言語の文法はどう違いますか?

A. Java は静的型付けで、変数宣言時に型を明示します(int x = 0;)。中括弧でブロックを表し、文末にセミコロンが必要です。Python の動的型付けや JavaScript の柔軟さに慣れていると最初は窮屈ですが、コンパイル時にバグが発見できる安全性がメリットです。

Q. コードが動かないときに最初に見るべき場所は?

A. コンパイルエラーは行番号とエラー種別(cannot find symbol、incompatible types など)が表示されます。実行時例外はスタックトレースの最初の at ... が原因行です。IDE(IntelliJ / VS Code)の警告も丁寧に潰すと、半分のバグは未然に防げます。

Q. Java の習得後に学ぶべき技術は何ですか?

A. 基本構文を抑えたら java-intermediate(コレクション / ジェネリクス / Stream / 例外)に進み、Spring Boot や Web 開発に展開するのが王道です。クラウド時代は Kotlin / Scala への展開も視野に入りますが、まずは Java 標準を固めるのが効率的です。

次のレッスン

次は インクリメントとデクリメント で、税抜き価格を受け取り、消費税 10% を加えた税込価格を整数で返すメソッドを書いて、算術演算と型変換の基礎を体に馴染ませる を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. 税込計算 の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. 税込計算 とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

要件

  1. Solution クラスに public static int taxIncluded(int price) を実装する
  2. price に消費税 10% を加えた金額を計算する (税込 = 税抜 × 1.1)
  3. 戻り値は int 型。小数点以下は切り捨てる (例: 99 → 108)

入出力例

test-cases.txt

taxIncluded(100)110 taxIncluded(1000)1100 taxIncluded(99)108 taxIncluded(0)0 taxIncluded(3980)4378

ヒント

main.java
main.java
学習モード

メモ

税込価格を計算する

⌘S で保存