税込計算の切り捨て事故を防げ
初段 / 目安 15分
朝いちばんで陽葵さんから電話がかかってきました。「税込価格がおかしいってお客様に言われたの! 450円の珈琲が、レジだと432円で出てくるの。安いぶんにはいいのかしらって思ったけど、よく考えたら税込のほうが安いってどういうこと?」。たしかに、税を足したのに元より安くなるのは変です。
前の担当者が書いた行はこれです。
Java
return price / 100 * 110;税率10パーセントを掛けたいので、100で割って110を掛ける。式としては読めます。しかし Java では、int どうしの割り算は小数を切り捨てます。四捨五入ではなく切り捨てです。450 / 100 は 4.5 ではなく 4 になり、そこに110を掛けて440。消えた 0.5 が、そのまま金額の穴になっています。
順番を入れ替えるだけで直ります。掛けてから割れば、割り算の時点では小数が出るほど小さな数になっていません。
完成条件
税抜価格を受け取り、税込価格を返すメソッド taxIncluded(int price) を作ってください。
- 税率は10パーセントとします
- 1円未満は切り捨てます。450 なら 495 です
- 戻り値は int です
次の値が正しく出れば通ります。
プレーンテキスト
450 -> 495
520 -> 572
480 -> 528
99 -> 10899 の税込は本当は 108.9 ですが、1円未満は切り捨てるので 108 です。今回は切り捨ててよい場面なので、切り捨て自体が悪者なのではありません。悪いのは、意図していない場所で勝手に切り捨てられることです。
進め方
白紙から書いてください。手が止まったらヒントを開けます。ヒントは3段階で、①方針、②使う構文、③部分解の順に出ます。1つも開けずに通せたら、その問題は自分のものです。
開かずに10分粘って進まないなら、①だけ開けてください。粘る時間そのものには価値がありません。価値があるのは、自分で書いた行が動いた瞬間です。
直し方は2通りあります。整数のまま計算の順番を変える道と、いったん小数にしてから整数へ戻す道です。どちらでも通ります。両方書いてみて、99円のときに同じ答えになるか確かめてみてください。
要件
- メソッド名は taxIncluded、引数は int price の1つ
- 税率は10パーセントとすること
- 1円未満は切り捨てること。450 の税込は 495 になる
- price / 100 * 110 のように先に割ってはいけない
- 戻り値は int にすること
入出力例
taxIncluded(450) → "495"
taxIncluded(520) → "572"
taxIncluded(480) → "528"
taxIncluded(99) → "108"
taxIncluded(100) → "110"
taxIncluded(0) → "0"ヒント
前のヒントを開くと次が開きます。開かずに解けると未開封クリアです