MENU

【Java】電卓アプリ作成/BigDecimal.divideメソッド実行時のエラーについて

こんにちは。
『スッキリわかる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;
    }
  }
}

f:id:kumaGoro_95:20200810230043p:plain
実行結果

で、ここで超苦戦したのがBigDecimalクラスのdivideメソッドです。
最初くまごろーは割り算のコードをこのように打っていました。

 case 4:
   BigDecimal result4 = bigd1.divide(bigd2);
   System.out.println(bigd1+" / "+bigd2+" = "+result4);
   break;

で、こんなエラーが発生

f:id:kumaGoro_95:20200810230412p:plain
エラー


「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