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

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

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

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

Q&A

解決済

1回答

2646閲覧

BigDecimalの循環小数エラー

I.K

総合スコア11

Java

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

0グッド

0クリップ

投稿2022/01/15 08:46

編集2022/01/15 20:32

前提・実現したいこと

数日前の質問の回答が得られなかったので再質問です。
Heroクラスの矢印をつけているところが循環小数になってしまい、エラーの原因みたいで、ならないように小数点切り捨てにしたのですがエラーが改善されません。どこを直したらいいのでしょうか。

発生している問題・エラーメッセージ

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. at java.base/java.math.BigDecimal.divide(BigDecimal.java:1722)

該当のソースコード

java

1import java.math.BigDecimal; 2import java.math.RoundingMode; 3 4class Hero { 5 int hp = 100; 6 7 public int useWaza(){ 8 BigDecimal bd1 = new BigDecimal(60); 9 BigDecimal bd2 = new BigDecimal("1.0"); 10 BigDecimal result = bd1.multiply(bd2); 11 int giveDamage = result.intValue(); 12 return damage(giveDamage); 13 } 14 15 public int damage(int gd) { 16 //BigDecimal bigDecimal3 = bigDecimalPlus.setScale(2, BigDecimal.ROUND_DOWN); 17 BigDecimal bd1 = new BigDecimal("1"); 18 BigDecimal bd2 = new BigDecimal("120"); 19 BigDecimal def = new BigDecimal(55); 20     ⇨BigDecimal dmgSubRate = bd1.divide((bd1.add(def.divide(bd2))),2, RoundingMode.DOWN); 21 22 BigDecimal giveDmg = new BigDecimal(gd); 23 BigDecimal resultDmg = giveDmg.multiply(dmgSubRate); 24 int receiveDmg = resultDmg.intValue(); 25 26 return this.hp -= receiveDmg; 27 } 28} 29
public class Main { public static void main(String[] args) { Hero h = new Hero(); h.useWaza(); System.out.println(h.hp); } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

まずは、問題の確認の為、各計算を分割し、エラーが発生している計算を特定します。

java

1 BigDecimal tmp1 = def.divide(bd2); 2 BigDecimal tmp2 = bd1.add(tmp1); 3 BigDecimal dmgSubRate = bd1.divide(tmp2,2, RoundingMode.DOWN);

特定できたら、必要な精度に丸めるなどの対応を行ってください。

なお、最後が小数部切り捨てなので、以下の計算で同じ結果になるかと。

java

1 int receiveDmg = gd * 120 / (120 + 55 )

投稿2022/01/15 11:32

YT0014

総合スコア1708

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.53%

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

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

質問する

関連した質問