有効桁数が 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
します。BigDecimal
BigDecimal も大量のガベージを作成しますが、double は何も生成しません。大量のガベージを作成すると処理が遅くなるだけでなく、CPU キャッシュがガベージでいっぱいになるため、残りのすべてのコードが遅くなります。
式で使用する double に変換するときに精度が失われないようにする方法。
double を使用すると、自分で精度を追跡する必要があります。これは、精度がわからない関数があり、それらに伝えることができず、値を渡す必要がある場合にのみ問題になります。つまり、答えを四捨五入する機会がありません。