質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

1144閲覧

ラムダ式のBigDecimalクラスへの変換

nn.nn

総合スコア3

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2021/05/27 16:27

前提・実現したいこと

次のプログラムをBigDecimalクラスで四則演算をするようにしたい

ソースコード

java

1package prog2; 2import java.util.*; 3import java.util.function.*; 4public class BigCalculatorFunc { 5 HashMap<String,DoubleBinaryOperator> optable = new HashMap<> (); 6 void run() { 7 optable.put("+",(x,y) -> {return x+y;}); 8 optable.put("-",(x,y) -> {return x-y;}); 9 optable.put("*",(x,y) -> {return x*y;}); 10 optable.put("/",(x,y) -> {return x/y;}); 11 Scanner sc = new Scanner(System.in); 12 while(true) { 13 String [] input = sc.nextLine().split("[ ]+"); 14 if(input[0].equals("quit")) break; 15 List<String> exp = Arrays.asList(input); 16 double ans = calcFromPostExp(exp); 17 System.out.println(ans); 18 } 19 sc.close(); 20 } 21 double calcFromPostExp(List <String> postExp) { 22 LinkedList<Double> stack = new LinkedList<Double>(); 23 for(String st: postExp) { 24 System.out.println(stack); // デバッグ用 25 System.out.println(st); // デバッグ用 26 if(optable.containsKey(st)) { 27 // 演算の処理 28 double v2 =stack.pollLast(); 29 double v1 =stack.pollFirst(); 30 double value = optable.get(st).applyAsDouble(v2,v1); 31 // スタックにプッシュする処理を下に書く 32 stack.push(value); 33 } else { 34 // それ以外は数字だと思う 35 double value = Double.parseDouble(st); 36 // スタックにプッシュする処理を下に書く 37 stack.push(value); 38 } 39 } 40 double ans =stack.pop(); 41 return ans; 42 } 43 public static void main(String[] args) { 44 new BigCalculatorFunc().run(); 45 } 46}

プログラミングの勉強を始めたばかりでBigDecimalの使い方がわかりません。
そこでHashMapを使用したラムダ式の四則演算を行う上のプログラムをBigDecimalに変換する場合どのように書き換えればいいのかがわかりません
どこに手をつけて変更すると良いでしょうか

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

  • DoubleBinaryOperatorBinaryOperator<BigDecimal>に変更
  • ラムダ式のreturnを、BigDecimalの四則演算メソッドを使用するものに変更

java

1 optable.put("+",(x,y) -> {return x+y;}); 23 optable.put("+",(x,y) -> {return x.add(y);});

ただし除算は注意が必要で、上と同様にx.divide(y)とすると、無限小数になるような除算(1÷3など)をする際に例外が発生してしまう。適当に「丸め」の設定を入れたほうが良い。例えば「小数第3位まで残し、小数第4位を四捨五入する」場合、

java

1 optable.put("/",(x,y) -> {return x.divide(y, 3, RoundingMode.HALF_UP);});
  • 変数型doubleおよびジェネリクスで使用しているDoubleBigDecimalに変更
  • 数値をスタックに詰める際の変換を、DoubleではなくBigDecimalのコンストラクタに変更

java

1 BigDecimal value = new BigDecimal(st);

他にもあるかもしれないが、そこは自分で考えて。

投稿2021/05/27 17:24

swordone

総合スコア20669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問