こんにちは。
『スッキリわかるJAVA入門』を読み終えてしばらく経ちましたが、
何か自分で作ってみたいと思い、とりあえず四則計算の電卓アプリを作成することにしました。
最終的にはGUIアプリにしたいのですが、電卓自体作ったことがないので、まずはCUIアプリとして作成に挑戦します。
とりあえず今日は
・ BigDecimalを使ってみる
・ 数値を入力させる(3つ以上の数値は計算できない)
・ 演算子は指定された数字を入力することで設定する
という仕様で、本当に簡単なものをつくりました。
import java.math.BigDecimal; import java.util.Scanner; public class Main{ public static void main(String [] args){ System.out.println("---------"); System.out.println("電卓アプリ"); System.out.println("---------"); System.out.println("最初の数字を入力してください"); Scanner scan1 = new Scanner(System.in); Double double1 = scan1.nextDouble(); BigDecimal bigd1 = BigDecimal.valueOf(double1); System.out.println("演算子は?"); System.out.println("[ 1: + 2: - 3: * 4: / ]"); Scanner scan3 = new Scanner(System.in); String input3 = scan3.nextLine(); int opera = Integer.parseInt(input3); System.out.println("2つ目の数字を入力してください"); Scanner scan2 = new Scanner(System.in); Double double2 = scan2.nextDouble(); BigDecimal bigd2 = BigDecimal.valueOf(double2); BigDecimal bigd3 = bigd1.add(bigd2); Calc(opera, bigd1, bigd2); } public static void Calc(int opera, BigDecimal bigd1, BigDecimal bigd2){ switch(opera){ case 1: BigDecimal result1 = bigd1.add(bigd2); System.out.println(bigd1+" + "+bigd2+" = "+result1); break; case 2: BigDecimal result2 = bigd1.subtract(bigd2); System.out.println(bigd1+" - "+bigd2+" = "+result2); break; case 3: BigDecimal result3 = bigd1.multiply(bigd2); System.out.println(bigd1+" * "+bigd2+" = "+result3); break; case 4: BigDecimal result4 = bigd1.divide(bigd2, 5, BigDecimal.ROUND_DOWN); System.out.println(bigd1+" / "+bigd2+" = "+result4); break; } } }
で、ここで超苦戦したのがBigDecimalクラスのdivideメソッドです。
最初くまごろーは割り算のコードをこのように打っていました。
case 4: BigDecimal result4 = bigd1.divide(bigd2); System.out.println(bigd1+" / "+bigd2+" = "+result4); break;
で、こんなエラーが発生
「Non-terminating decimal expansion; no exact representable decimal result.」
計算結果が循環小数になると発生するようです。
これはBigDecimalの丸め処理を実施すれば回避できるとのこと。
それを調べて修正したコードがこれ。
case 4: BigDecimal result4 = bigd1.divide(bigd2); BigDecimal resultRound = result4.setScale(5, BigDecimal.ROUND_DOWN); System.out.println(bigd1+" / "+bigd2+" = "+resultRound); break;
それでも消えないエラー・・・なんでやと思ったら、divideメソッドに直接処理を施さなければならないんですね。
わかってしまえば簡単ですが、結構苦戦しました(-"-)
case 4: BigDecimal result4 = bigd1.divide(bigd2, 5, BigDecimal.ROUND_DOWN); System.out.println(bigd1+" / "+bigd2+" = "+result4); break;
これでうまくいきました。
BigDecimalについては、このページを参考にしました。
www.sejuku.net