- ベストアンサー
計算する度にBigDecimalオブジェクト作成?
javaのDouble型の足し算をするには、BigDecimalを使わなければ 正確な数値が得られない、ということで使用したのですが、 毎回、小数点の足し算をする度に、 負荷のかかるnew宣言でBigDecimalのインスタンスを作りaddメソッドで計算するというはどうも非効率に思ってしまうのです、、; javaでの小数点の足し算は皆さん通常どうやっているのでしょうか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
大概の演算はdouble型の演算精度で足りますし、演算誤差を減らすような演算方法も色々知られています。 double型では有効桁数がどうやっても足りないとか、10進←→2進の変換に伴う誤差を嫌う場合にはBigDecimalを使うしかないかもしれません。
その他の回答 (5)
- 中村 拓男(@tknakamuri)
- ベストアンサー率35% (674/1896)
> クライアントがもたらすランダムな引数を四則計算する場合は、 > 四則別にそれぞれ誤差を出さない計算方法のセオリーなどがあるのでしょうか? 例えば 1.0 / 3.0 を誤差なしで保持する数値型は Java に用意されていません。 結局誤差を制御するには誤差を見積もって計算に必要な精度を見積もるしかなく 簡単なルールといったものはありません。
お礼
BigDecimalでも、1.0/3.0は誤差が出るのですね? 知らなかったです。 やはり、自分で結果を制御する式を作るしかないのですね。。 ありがとうございました。
- salsberry
- ベストアンサー率69% (495/711)
> クライアントがもたらすランダムな引数を四則計算する場合は、 > 四則別にそれぞれ誤差を出さない計算方法のセオリーなどがあるのでしょうか? 「○○方程式を××法を使って解く場合に、計算方法や手順をこうすれば誤差を減らせる」のように特定の問題領域についてのノウハウは様々ありますが、完全に任意の値、任意の演算だと無理でしょうね。
お礼
ランダムな引数な場合、 望んだ結果を出すように自分で導くしかないんですね。 誤差が出ないような式を造り、どのタイミングで使うか、検討してみます。 ありがとうございました。
- salsberry
- ベストアンサー率69% (495/711)
> 「誤差を減らすような演算方法」の具体例などがあれば教えて頂ければありがたいです。 ごくごく単純な例を挙げます。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
お礼
ありがとうございました。
補足
なるほど!xが三回目から累積誤差を出しているのを見て、 yは毎回新しい値で累積させないようにしているのですね。 今回は、計算する値、計算方法、回数、結果、が定まっていたケースですが、 たとえば、クライアントがもたらすランダムな引数を四則計算する場合は、 四則別にそれぞれ誤差を出さない計算方法のセオリーなどがあるのでしょうか? その公式の様な物が紹介されているサイトがあれば良いのですが、、。
- 中村 拓男(@tknakamuri)
- ベストアンサー率35% (674/1896)
>javaのDouble型の足し算をするには、BigDecimalを使わなければ >正確な数値が得られない これはどこの情報なんでしょうか? BigDecimalは強力ですけど、「必要な精度」が double で十分ならば、 doubleで処理した方がはるかに効率的です。 doubleの精度は 10進だと 16桁強です。
お礼
ありがとうございました。
補足
小数点の計算をして下記と同じ様な症状が出たのでBigDecimalを使いました。 http://javafaq.jp/S029.html このサイトの [S029-Q01] です。
- Gotthold
- ベストアンサー率47% (396/832)
科学技術系の計算なら大抵はdouble型の精度で十分です。 (それに10進数については丸め誤差がでないと言うことにさほど意味がない。) (お金の事務計算などで)2進-10進の変換での誤差を気にするなら 最初から最後までBigDecimalを使うべきで double型を経由するべきではないと思います。
お礼
ありがとうございました。
補足
そうですね。誤差は気になります。 ただ、自分で丸めるのも、 BigDecimalで丸めるのも同じとなるとBigDecimalを使う意味がなくなりますが、、。
お礼
ありがとうございました。
補足
「誤差を減らすような演算方法」の具体例などがあれば教えて頂ければありがたいです。 二進数double型の計算結果をどの様な基準で丸めればよいか?に悩んでいたので、 それならば、とString→BigDecimal→Stringで扱おうと思ったしだいです。