6日目:消費税込みで何円?

Java超・入門物語
ぽっちゃん
ぽっちゃん

う〜〜〜ん。。。

しがない先生
しがない先生

お、開始早々悩んでいるね。

今日はどうしたんだい?

ぽっちゃん
ぽっちゃん

それが、、、

今まで習ってきたことを活かして「消費税込みの商品の価格」を計算するプログラムを頑張って作っているんですけど、、、

ぽっちゃん
ぽっちゃん

なかなか思い通りにいかなくて困っているんですよ。。。

しがない先生
しがない先生

なるほどね。

下のプログラムがぽっちゃんが途中まで作ってくれたものだね。

import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        // Your code here!
        
        int zeinuki = 100;
        int shouhizei = 1.1;
        System.out.println(zeinuki * shouhizei);
    }
}
しがない先生
しがない先生

ほう。

なかなかいいところまで書けているじゃないか。

ぽっちゃん
ぽっちゃん

僕もそうだと思っていたんですけど、実行してみたらエラーが出るんですよね。。。

ぽっちゃん
ぽっちゃん

ほんとは「110」って表示させたいのに。。。

しがない先生
しがない先生

なるほど。

では今回もエラーの内容を見ていこうか。

ぽっちゃん
ぽっちゃん

これが実行したときに出ちゃったエラーです。

Main.java:8: error: incompatible types: possible lossy conversion from double to int
        int shouhizei = 1.1;
                        ^
1 error
しがない先生
しがない先生

ばるほど

では前回このエラーメッセージからある程度ヒントが与えられているって話をしたんだけど、どこだったか覚えているかな?

ぽっちゃん
ぽっちゃん

ええっと、「Main.java:8」と書かれているから8行目の「int shouhizei = 1.1;」エラーが出ていて、、、

ぽっちゃん
ぽっちゃん

その後の「error: incompatible types: possible lossy conversion from double to int」というのはエラーの内容で、日本語に翻訳すればいいってことでしたよね?

しがない先生
しがない先生

そのとおり!

ではその文を実際に翻訳してみようか。

ぽっちゃん
ぽっちゃん

え〜、翻訳すると、、、

エラー: 互換性のない型: double から int への非可逆変換の可能性

ぽっちゃん
ぽっちゃん

ふむふむ、、、ヒカギャクヘンカンのカノウセイか。。。

ぽっちゃん
ぽっちゃん

ってわかんねーーーーー!!!!!

しがない先生
しがない先生

まぁちょっとだけ難しい用語が出てきちゃったね。

これをとても噛み砕いて言うと、「小数を整数に変えられない」と言っているんだ。

ぽっちゃん
ぽっちゃん

「小数を整数に変えられない」。。。

ん?なんかこれ前回と同じようなニュアンスのエラーですね。

しがない先生
しがない先生

そうだね。

前回は確か「数字を文字に変えられない」という内容のエラーだったよね。

ということでもう一度8行目のエラーが出た行のプログラムを見てみよう。

int shouhizei = 1.1;
ぽっちゃん
ぽっちゃん

う〜ん。

int型の変数の中に1.1を代入しているだけ」なんですけどね。。。

しがない先生
しがない先生

やりたいことはとても合っているよ。

ではここで1つぽっちゃんに質問なんだけど、「int型(整数型)」とは何だと思う?

ぽっちゃん
ぽっちゃん

え、、、?

それはもちろん「Stringは文字、intは数字」としがない先生が言ってくれたように、「数字」のことだと思いますけど。。。

しがない先生
しがない先生

大正解!

でも厳密にはJavaにおける「数字」には、「整数」と「小数」の2つに分かれているんだ。

ぽっちゃん
ぽっちゃん

ん、ということは「2」とか「3.14」が違う型になるということですか?

しがない先生
しがない先生

おー、そういうことだよ。

Javaでは

「2」や「10」といった整数は「int型(整数型)」

「3.14」や「1.1」といった小数は「double型(浮動小数点数型)」

という風に定義されているんだ。

ぽっちゃん
ぽっちゃん

フドウショウスウテンスウ型。。。

しがない先生
しがない先生

ま、小数の型なんだなってことで覚えておいてね。

しがない先生
しがない先生

ということで一旦話を戻してもう一度プログラムを見ていこう。

今エラーが出ているプログラムは、、、

int shouhizei = 1.1;
ぽっちゃん
ぽっちゃん

int型を入れられる変数に対して、「1.1」というdouble型を入れているってことだから、、、

ぽっちゃん
ぽっちゃん

アッ!もしかして、、、!

double shouhizei = 1.1;
ぽっちゃん
ぽっちゃん

double型を入れられる変数に「1.1」というdouble型を入れるとか。。。

しがない先生
しがない先生

お見事!

ズバリ、そういうことだよ。

結局全体のプログラムは次のようになるね。

import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        // Your code here!
        
        int zeinuki = 100;
        double shouhizei = 1.1;
        System.out.println(zeinuki * shouhizei);
    }
}
しがない先生
しがない先生

では最後に実行して結果を確認してみよう。

ぽっちゃん
ぽっちゃん

よし、実行っと!

110.00000000000001
ぽっちゃん
ぽっちゃん

110.00000000000001」。。。

ワーォ、ジーザス!!!

しがない先生
しがない先生

よしよし、思ったとおりだね。

ぽっちゃん
ぽっちゃん

いや、明らかにおかしいでしょ。。。

「110」の後に0が何個も続いて、ついに僕の目はおかしくなったのか。。。

しがない先生
しがない先生

いや、これで合っているんだよ。

Javaでは「整数 × 小数」はこのような誤差が出てしまうんだ。

ぽっちゃん
ぽっちゃん

なんでこんなことが起きてしまうんですか。。。

普通に「110」と表示してくれたらいいだけなのに。。。

しがない先生
しがない先生

これは「double型を10進数ではなく2進数で表現している」から起こる誤差なんだけど、これについて話を広げていくと、レッスンが1つ出来上がってしまうくらい深い話になってしまうから、「これはそういうものなんだな」という感じで最初は納得しておこう

ぽっちゃん
ぽっちゃん

なるほど。

でもそれは分かったんですけど、やっぱり「110」と表示させたいです。

しがない先生
しがない先生

そうだね。

では明日はこれを強制的に「110」にさせて、さらにこの「消費税込みの商品の価格」を計算するプログラムを完成させていこうか。

ということで次回「7日目:消費税込みで何円?②」というテーマでお話ししていくよ。

ぜひお楽しみに。

ぽっちゃん
ぽっちゃん

しがない先生、今日もありがとうございました。

コメント

タイトルとURLをコピーしました