0

大きな数を扱う方法についての説明をあちこちで読みましたが、同じクラスの BigNumber を非常に小さな数にも使用できるようです。

ただし、精度を落とさずに機能させる方法がわかりません。

方程式で使用したい 0.0000000000012 のような数値がありますが、BigNumber を使用してこの数値を作成する方法がわかりません (それが使用する必要がある場合)。私の方程式で。

方程式で使用されるすべての数値を BigDecimal として配置する必要があります (単純な値 (12、0.1、...) または 0.0000000000012 のみを持つ数値であっても BigNumber にする必要があり、精度が失われないと確信できますか?

よろしくお願いします、B.

4

3 に答える 3

4

クラスBigDecimalを使用します。任意の精度の 10 進数を表すために使用できます。double で表現するには正確すぎるリテラルから BigDecimal を作成するには、文字列コンストラクターを使用します。

BigDecimal almostOne = new BigDecimal("0.999999999999999999999999999999999999999987", MathContext.UNLIMITED);

それらを double に変換すると、精度が失われます。そのため、 BigDecimal クラスには、精度を維持しながら基本的な算術演算を実行するためのさまざまなメソッドがあります。

BigDecimal exactlyTen = new BigDecimal(10);
BigDecimal almostTen = almostOne.multiply(exactlyTen);

コードのパフォーマンスが重要な場合は、「Java BigDecimal のパフォーマンスをどうするか?」という質問をさらに読むことをお勧めします。

于 2013-06-19T12:24:04.590 に答える
3
String number = "0.0000000000012";

BigDecimal decimal = new BigDecimal(number);
System.out.println(decimal.toString());
decimal = decimal.multiply(new BigDecimal(1000000000000L));
System.out.println(decimal.toString());

これは、このコードを実行して BigDecimal Number を使用およびテストする方法のコードです。Fir sysout は、0.0000000000012 に相当する1.2E-12を返します。これをテストするには、これに 1000000000000 を掛けて 1.2 にします。つまり、精度を失うことはありません。

于 2013-06-19T12:25:30.620 に答える
0

有効桁数が 15 桁を超えない限り、BigDecimal を使用する必要はありません。BigDecimal が役立つ適切な丸めを使用する必要がありますが、double で同じことができないという意味ではありません。

double d = 0.0000000000012;
BigDecimal bd = BigDecimal.valueOf(d);
System.out.println("before d: " + d + " bd: " + bd);
d *= 1000000000000L;
d = Math.round(d * 1e2) / 1e2; // round to two places
bd = bd.multiply(BigDecimal.valueOf(1000000000000L));
System.out.println("after d: " + d + " bd: " + bd);

版画

before d: 1.2E-12 bd: 1.2E-12
after d: 1.2 bd: 1.2000000000000

パフォーマンスに関しては、100 倍のパフォーマンスを発揮doubleします。BigDecimalBigDecimal も大量のガベージを作成しますが、double は何も生成しません。大量のガベージを作成すると処理が遅くなるだけでなく、CPU キャッシュがガベージでいっぱいになるため、残りのすべてのコードが遅くなります。

式で使用する double に変換するときに精度が失われないようにする方法。

double を使用すると、自分で精度を追跡する必要があります。これは、精度がわからない関数があり、それらに伝えることができず、値を渡す必要がある場合にのみ問題になります。つまり、答えを四捨五入する機会がありません。

于 2013-06-19T13:05:52.770 に答える