
う〜〜〜ん。。。

お、開始早々悩んでいるね。
今日はどうしたんだい?

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

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

なるほどね。
下のプログラムがぽっちゃんが途中まで作ってくれたものだね。
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日目:消費税込みで何円?②」というテーマでお話ししていくよ。
ぜひお楽しみに。

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


コメント