• ベストアンサー

計算する度にBigDecimalオブジェクト作成?

javaのDouble型の足し算をするには、BigDecimalを使わなければ 正確な数値が得られない、ということで使用したのですが、 毎回、小数点の足し算をする度に、 負荷のかかるnew宣言でBigDecimalのインスタンスを作りaddメソッドで計算するというはどうも非効率に思ってしまうのです、、; javaでの小数点の足し算は皆さん通常どうやっているのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

大概の演算はdouble型の演算精度で足りますし、演算誤差を減らすような演算方法も色々知られています。 double型では有効桁数がどうやっても足りないとか、10進←→2進の変換に伴う誤差を嫌う場合にはBigDecimalを使うしかないかもしれません。

bajiriko
質問者

お礼

ありがとうございました。

bajiriko
質問者

補足

「誤差を減らすような演算方法」の具体例などがあれば教えて頂ければありがたいです。 二進数double型の計算結果をどの様な基準で丸めればよいか?に悩んでいたので、 それならば、とString→BigDecimal→Stringで扱おうと思ったしだいです。

その他の回答 (5)

回答No.6

> クライアントがもたらすランダムな引数を四則計算する場合は、 > 四則別にそれぞれ誤差を出さない計算方法のセオリーなどがあるのでしょうか? 例えば 1.0 / 3.0 を誤差なしで保持する数値型は Java に用意されていません。 結局誤差を制御するには誤差を見積もって計算に必要な精度を見積もるしかなく 簡単なルールといったものはありません。

bajiriko
質問者

お礼

BigDecimalでも、1.0/3.0は誤差が出るのですね? 知らなかったです。 やはり、自分で結果を制御する式を作るしかないのですね。。 ありがとうございました。

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.5

> クライアントがもたらすランダムな引数を四則計算する場合は、 > 四則別にそれぞれ誤差を出さない計算方法のセオリーなどがあるのでしょうか? 「○○方程式を××法を使って解く場合に、計算方法や手順をこうすれば誤差を減らせる」のように特定の問題領域についてのノウハウは様々ありますが、完全に任意の値、任意の演算だと無理でしょうね。

bajiriko
質問者

お礼

ランダムな引数な場合、 望んだ結果を出すように自分で導くしかないんですね。 誤差が出ないような式を造り、どのタイミングで使うか、検討してみます。 ありがとうございました。

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.4

> 「誤差を減らすような演算方法」の具体例などがあれば教えて頂ければありがたいです。 ごくごく単純な例を挙げます。3.1から4.0まで0.1刻みの値を得ようとするものですが、3.3のところからxとyで差が出ていることが分かりますよね。 double x=3.0; double y0=3.0, y; for (int i=1; i<=10; i++) { x += 0.1; y = y0+0.1*i; System.out.println("x="+x+", y="+y); } x=3.1, y=3.1 x=3.2, y=3.2 x=3.3000000000000003, y=3.3 x=3.4000000000000004, y=3.4 x=3.5000000000000004, y=3.5 x=3.6000000000000005, y=3.6 x=3.7000000000000006, y=3.7 x=3.8000000000000007, y=3.8 x=3.900000000000001, y=3.9 x=4.000000000000001, y=4.0

bajiriko
質問者

お礼

ありがとうございました。

bajiriko
質問者

補足

なるほど!xが三回目から累積誤差を出しているのを見て、 yは毎回新しい値で累積させないようにしているのですね。 今回は、計算する値、計算方法、回数、結果、が定まっていたケースですが、 たとえば、クライアントがもたらすランダムな引数を四則計算する場合は、 四則別にそれぞれ誤差を出さない計算方法のセオリーなどがあるのでしょうか? その公式の様な物が紹介されているサイトがあれば良いのですが、、。

回答No.3

>javaのDouble型の足し算をするには、BigDecimalを使わなければ >正確な数値が得られない これはどこの情報なんでしょうか? BigDecimalは強力ですけど、「必要な精度」が double で十分ならば、 doubleで処理した方がはるかに効率的です。 doubleの精度は 10進だと 16桁強です。

bajiriko
質問者

お礼

ありがとうございました。

bajiriko
質問者

補足

小数点の計算をして下記と同じ様な症状が出たのでBigDecimalを使いました。 http://javafaq.jp/S029.html このサイトの [S029-Q01] です。

  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.2

科学技術系の計算なら大抵はdouble型の精度で十分です。 (それに10進数については丸め誤差がでないと言うことにさほど意味がない。) (お金の事務計算などで)2進-10進の変換での誤差を気にするなら 最初から最後までBigDecimalを使うべきで double型を経由するべきではないと思います。

bajiriko
質問者

お礼

ありがとうございました。

bajiriko
質問者

補足

そうですね。誤差は気になります。 ただ、自分で丸めるのも、 BigDecimalで丸めるのも同じとなるとBigDecimalを使う意味がなくなりますが、、。

関連するQ&A