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

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

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

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

Q&A

解決済

2回答

3651閲覧

Java: BigDecimalを使って1/3*3を行うと0.9999...になる

Nippun

総合スコア1147

Java

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

0グッド

0クリップ

投稿2017/01/10 20:25

編集2017/01/11 00:39

JavaでBigDecimalを使って1/3*3を行うと0.9999...になります。答えが1にするようにするにはどうすればいいですか?

BigDecimal d1 = new BigDecimal("1"); BigDecimal d2 = new BigDecimal("3"); BigDecimal d3 = new BigDecimal("3"); BigDecimal result = new BigDecimal("0"); result = d1.divide(d2, 5, BigDecimal.ROUND_HALF_DOWN); result = result.divide(d3, 5, BigDecimal.ROUND_HALF_DOWN); コード

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/01/10 23:25

丸め誤差わ勉強すべし
mit0223

2017/01/11 00:25

すみません。このコードで1/3*3になってますか?
swordone

2017/01/11 00:55

最後かけ算なんだろうけど割り算になってる
guest

回答2

0

ベストアンサー

質問のコードが完成されていないので、想像で回答します。
まず、10進数で 1/3*3 を手計算しても0.9999... になる場合はありますよね?

1/3 を小数点以下5桁で四捨五入で求めよ
答え= 0.33333

0.33333 × 3 を小数点以下5桁で四捨五入で求めよ
答え= 0.99999

で、これに対する対策はいろいろ考えられますが、BigDecimal を使うような場面(金融の金利計算など)では、誰がやっても同じ結果が得られることが要件となっており、個々に計算方法の仕様(いつ何桁目を四捨五入するかなど)が決められているはずです。

単純に10進数で計算してるのだから元に戻れよと思うのであれば、1桁多めに計算して、最後に四捨五入すれば良いと思いますが、そういうものが欲しいのであれば、 BigDecimal を使う必要は無く、Double で計算しておいて、最後に自分のほしい桁数で丸めるほうが簡単だと思います。

投稿2017/01/11 00:54

mit0223

総合スコア3401

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

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

Nippun

2017/01/11 03:13

ありがとうございます。解決しました。
guest

0

多めの桁数で計算しておいて、最後に必要な精度で丸めを行うのはいかがでしょうか?

投稿2017/01/10 22:35

takeshi

総合スコア264

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

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

yuba

2017/01/10 23:31

最後の行にROUND_HALF_DOWN とありますから、「(多目の桁数で計算して)丸めたのに望む結果にならないのはなぜか」という質問かと思いますが。
takeshi

2017/01/11 01:00

言葉足らずだったかもしれません。 演算(又は割り算時)は、多めの桁数で。 演算後の出力時(又は掛け算時)に、必要な桁数にすればよいかと。 例えば、演算は、5桁で、0.33333 * 3 => 0.99999 そして 4 桁で丸めれば、1 になるかと。
Nippun

2017/01/11 03:14

ありがとうございます。解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問