ここから本文です

Javaの数値の切り捨てについて 最近Javaの勉強をし始めた初心者です。 小数第4...

jjj********さん

2015/5/2618:33:07

Javaの数値の切り捨てについて

最近Javaの勉強をし始めた初心者です。
小数第4位以下の切り捨てをBigDecimalを使って行おうと思ったのですが、思ったような結果になりません。

3×3×3.3の答えは29.7になるはずですが、BigDecimalを使うと29.699という結果になってしまいます。Math.floor()を使うと正しい結果になったのですが、なぜBigDecimalだとこういう結果になるのか分かりません。
2進数の小数なので多少の誤差は仕方がないと聞いたことがありますが、BigDecimalもこれに当てはまるのですか?
回答よろしくお願いします。

import java.math.BigDecimal;

public class Main {
public static void main(String[] args) {

double value = 3 * 3 * 3.3;


BigDecimal bd_value = new BigDecimal(value);
bd_value = bd_value.setScale(3, BigDecimal.ROUND_DOWN);

System.out.printf("%.3f\n", bd_value);
System.out.printf("%.3f\n", Math.floor(value * 1000) / 1000);
}
}
実行結果
29.699
29.700

閲覧数:
139
回答数:
2
お礼:
25枚

違反報告

ベストアンサーに選ばれた回答

ghk********さん

2015/5/2618:37:25

当然ですよ。3*3*3.3の計算をdoubleでやっていますよね。
その時点で誤差が発生しています。
それからBigDecimalに代入したところで意味がありません。

BigDecimalの3 と 3.3 をnewし、それをBigDecimalの演算
メソッドを用いて計算しなければ。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

質問した人からのコメント

2015/5/26 18:54:59

お二方ありがとうございます。BigDecimalを使って29.700と表示することができました。ベストアンサーは一番早かったghko7321さんにしました。

ベストアンサー以外の回答

1〜1件/1件中

foo********さん

2015/5/2618:48:06

>3×3×3.3の答えは29.7になるはずですが、BigDecimalを使うと29.699という結果になってしまいます。

double で計算してしまってますよね?
計算結果を BigDecimal に与えてるだけで。

以下だと 29.7 と印字されます。
-------
import java.math.BigDecimal;

public class Main {
___ public static void main(String[] args) {
___ ___ // 3 * 3 * 3.3
___ ___ BigDecimal bd = new BigDecimal( 3 );
___ ___ bd = bd.multiply( bd );
___ ___ bd = bd.multiply( new BigDecimal("3.3") );

___ ___ System.out.println( bd );
___ }
}
---------

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる