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

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

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

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

Q&A

解決済

2回答

664閲覧

Java 小数点で、指定した桁数以下を切り下げするBigDecimalについて

eggplant_bc

総合スコア20

Java

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

0グッド

0クリップ

投稿2018/03/22 04:37

Javaにて、以下のプログラムを作っています。

  1. 浮動小数点を2つ入力する
  2. その2つの数値を、小数点以降4桁目から切り捨てる
  3. 切り捨て後の数が同じかどうかを比較する

Java

1BigDecimal nums1 = new BigDecimal(num1); 2BigDecimal nums2 = new BigDecimal(num2); 3BigDecimal number1 = nums1.setScale(3, BigDecimal.ROUND_DOWN); 4BigDecimal number2 = nums2.setScale(3, BigDecimal.ROUND_DOWN);

上記のコードを書いて試しに以下のコードでプリントしてみたところ、しっかりと4桁目から後は切り捨てられて表示されました。

Java

1System.out.println(number1); 2System.out.println(number2);

ただ、System.out〜ではなくif文を書くと切り捨て前の数値で比較されてしまうのか、切り捨て後の数値が同じでもelseの方が出力されてしまいます。

Java

1if (number1 == number2) { 2 System.out.println("same"); 3} else { 4 System.out.println("different"); 5}

切り捨て後の数値で比較したいのですが、解決方法をご存知でしたらぜひ教えていただきたいです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは.
BigDecimalは「基本データ型」ではなく「クラス」です。
大小比較をするとき単純な不等号での比較はできません。
(他にも,単純に”+”や”-“の記号を使って四則演算ができません。)

そこで、使うのがcompareToです。
下のソースのように、値1.compareTo(値2)とすると、以下のようになります。

・値1 < 値2 ならば、-1を返す
・値1 = 値2 ならば、 0を返す
・値1 > 値2 ならば、 1を返す

私はswitch文で書きました。

詳しくはhttps://www.sejuku.net/blog/21589をご覧ください。

Java

1 2import java.math.BigDecimal; 3import java.util.Scanner; 4 5public class Main { 6 7 public static void main(String[] args) { 8 9 Scanner sc = new Scanner(System.in); 10 String line = sc.nextLine(); 11 String line2 = sc.nextLine(); 12 double num1 = Double.parseDouble(line); 13 double num2 = Double.parseDouble(line2); 14 BigDecimal nums1 = new BigDecimal(num1); 15 BigDecimal nums2 = new BigDecimal(num2); 16 BigDecimal number1 = nums1.setScale(3, BigDecimal.ROUND_DOWN); 17 BigDecimal number2 = nums2.setScale(3, BigDecimal.ROUND_DOWN); 18 19 System.out.println(number1 + " "+ number2); 20 21 switch (number1.compareTo(number2)) { 22 case 1: 23 System.out.println(number1 + "が大きい"); 24 break; 25 case 0: 26 System.out.println("等しい"); 27 break; 28 case -1: 29 System.out.println(number2 + "が大きい"); 30 break; 31 default: 32 break; 33 } 34 } 35 36}

投稿2018/03/22 04:50

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

eggplant_bc

2018/03/22 05:26

Stars1024様 ご回答いただきありがとうございます! 教えていただいたcompareToで意図通りの結果を出力することができました。 不等号での比較ができないとは知らなかったです…。とても勉強になりました。 本当にありがとうございました!
swordone

2018/03/23 01:31

compareToは「正の数」「負の数」「ゼロ」のいずれかを返すメソッドであり、1,-1,0であることは保証しないので、0との比較で判定するべきです。 また、BigDecimal.ROUND_DOWNのようなBigDecimalクラスの定数を使って丸めモードを指定するのは推奨されません。列挙型RoundingModeを使いましょう。
swordone

2018/03/23 01:51

あら、失礼しました。
guest

0

==で比較すると、比較対象の変数が指すアドレスが同じである場合にtrueが返ります。今回の場合、nums1とnums2は別々に宣言したインスタンスであるため、アドレスが異なり、==ではfalseとなります。

対応としては、前の回答者さんのようにcompareToを使うか、あるいはequalsを使うこともできます。これらはBigDecimalクラスにあらかじめ実装されたメソッドで、人間の感覚に近い基準で等しさを判定できます。
compareToequalsの違いは、ドキュメントを見てみてください。
https://docs.oracle.com/javase/jp/8/docs/api/java/math/BigDecimal.html

もちろん、BigDecimalクラス以外でもcompareToequalsが実装されているクラスは多いです。
また、ときには自分でこれらのメソッドを実装したり、オーバーライドしたりする必要があるときもあります。

投稿2018/03/22 04:58

Udomomo

総合スコア1524

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

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

eggplant_bc

2018/03/22 05:28

Udomomo様 ご回答いただきありがとうございます! compareToで意図通りの結果を出力することができましたが、equalsを使う方法もあるんですね! そちらの方法も試してみたいと思います。 ご教示いただきまして、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問