6

Javaでいくつかの数値を完全な精度で表現し、小数点以下の小数点数を固定する必要があります。その小数点以下は気にしません。(より具体的には-お金とパーセンテージ。)

今はJava独自のBigDecimalを使用しましたが、非常に遅く、アプリケーションに表示され始めていることがわかりまし

したがって、「通常の」整数と固定小数点演算を使用して解決したいと思います(長い整数は、私の目的には十分な精度があります)。

さて、私はこの種の問題を抱えている最初の人ではないと思います。すでに乗算/除算が実装されているそのためのライブラリがすでに存在するでしょうが、そうではないようです。

今、私はおそらく自分でそれを書くことができます(そして私はおそらくそうするでしょう)が、本当に、私は本当にこれを必要とする最初の人ですか?そのためのライブラリはすでにありませんか?

4

4 に答える 4

9

decimal4jは、小数点以下18桁までをサポートする、longに基づく高速固定精度演算用のJavaライブラリです。

開示:私はdecimal4jプロジェクトに関わっています。

于 2015-11-06T22:00:19.750 に答える
6

BigDecimalがパフォーマンスの問題であると完全に確信していますか?プロファイラーを使用して調べましたか?はいの場合、役立つ可能性のある2つのオプションは次のとおりです。

1)longすべての値を使用し、係数を掛けます(たとえば、セントに関心がある場合は100)。

2)に似たものを実装する特別に設計されたクラスを使用しますが、内部BigDecimalで使用します。long優れたオープンソースライブラリが存在するかどうかはわかりません(おそらくJava Math Fixed Point Library?)。私はかなり前に(2001年に)J2ME用にそのようなクラスを自分で作成しました。正しく理解するのは少し難しいです。BigDecimal高精度が必要な場合を除いて、内部でも使用することに注意してくださいlong。したがって、このソリューションはほとんどの場合、ほんの少ししか役に立ちません。

double丸めと精度の問題があるため、多くの場合、使用は適切なオプションではありません。

于 2012-08-11T18:13:09.950 に答える
0

これはあなたが求めているものとは正確には異なりますが、これはアプリを離れることなくスピードアップすることができますBigDecimal

Java 8以降、これはBigDecimalそれ自体で解決されます。新しいクラスMathContextが追加され、演算の計算精度が制限されます。

var num = new BigDecimal("1234.56780", new MathContext(10, RoundingMode.DOWN));

10欠点は、小数点以下の桁には精度が適用されないことです。有効桁数に適用されます。の場合1234.50、6が必要です。
の場合1_500_000_000.100、数をそのまま維持するには13が必要です。
したがって、精度が10で、数十億のチェココルナを数えると、精度が低下する可能性があります。
それでも、たとえば1000の精度は、無制限の精度(デフォルトだと思います)よりもはるかに高速です。

これは、個々の操作にも適用できます。

BigDecimal n = new BigDecimal("0.12345");
n = n.pow(2, new MathContext(1000, RoundingMode.DOWN));
n = n.pow(2, new MathContext(1000, RoundingMode.DOWN));
n = n.pow(2, new MathContext(1000, RoundingMode.DOWN));
n = n.pow(2, new MathContext(1000, RoundingMode.DOWN));
于 2018-10-14T23:27:32.053 に答える
-1

そのためのライブラリが必要な理由がわかりません。

たとえば、同じ固定精度で2つのロングを追加するとします。

long c = a + b;

整数で乗算したい固定精度の数値があるとします

long c = a * i;

数値をゼロに丸める整数で除算したいとします

long c = a / i;

小数点以下3桁の固定精度の数値を印刷するとします。

System.out.println(c / 1e3);

おそらく、あなたは問題を考えすぎて、すべてのためのライブラリが必要だと思っています。

使用している場合、longまたはdouble丸めに少数のヘルパーメソッドが必要な場合がありますが、ライブラリ自体は必要ありません。

于 2012-08-11T19:02:22.547 に答える