web-dev-qa-db-ja.com

BigDecimal、精度およびスケール

JPAなど、アプリケーションの番号にBigDecimalを使用しています。 「精度」と「スケール」という用語について少し調査しましたが、それらが正確に何なのかわかりません。

BigDecimal値の「精度」と「スケール」の意味を誰かが説明できますか?

@Column(precision = 11, scale = 2)

ありがとう!

52
jpadilladev

BigDecimalは2つの値で定義されます:任意精度整数と32ビット整数scaleBigDecimalの値は、 unscaledValue*10^{-scale}

精度:

精度 は、スケールなしの値の桁数です。たとえば、数値123.45の場合、返される精度は5です。

したがって、precisionは、任意精度整数の長さを示します。以下に、スケールが同じで精度が異なる数の例を示します。

  • 12345/100000 = 0.12345 //スケール= 5、精度= 5
  • 12340/100000 = 0.1234 //スケール= 5、精度= 4
  • 1/100000 = 0.00001 //スケール= 5、精度= 1

数値がゼロ(0.000など)である特別な場合、精度は常に1です。

スケール:

ゼロまたは正の場合、 scale は小数点の右側の桁数です。負の場合、数値のスケールなしの値に10のスケールの否定の乗を掛けます。たとえば、スケールが-3の場合、スケールなしの値に1000が乗算されます。

これは、「BigDecimal」の整数値に乗算されることを意味します 10^{-scale}

以下に、スケールが異なる同じ精度の例をいくつか示します。

  • スケール5の12345 = 0.12345
  • スケール4の12345 = 1.2345
  • スケール0の12345 = 12345
  • スケール-1の12345 = 123450

BigDecimal.toString:

toStringBigDecimalメソッドは、スケールとprecisionに基づいて異なる動作をします。 (これを指摘してくれた@RudyVelthuisに感謝します。)

  • scale == 0の場合、整数はそのまま出力されます。
  • scale < 0の場合、E表記が常に使用されます(たとえば、5 scale -1は「5E + 1」を生成します)
  • scale >= 0およびprecision - scale -1 >= -6の場合、プレーンな10進数が生成されます(たとえば、10000000スケール1は「1000000.0」を生成します)
  • それ以外の場合、E表記が使用されます。 precision - scale -1が等しいため、10スケール8は「1.0E-7」を生成します unscaledValue*10^{-scale} -6未満です。

その他の例:

  • 19/100 = 0.19 //整数= 19、スケール= 2、精度= 2
  • 1/1000 = 0.0001 //整数= 1、スケール= 4、精度= 1
75
Austin D
  • 精度:有効数字の総数

  • スケール:小数点の右側の桁数

詳細については、 BigDecimal クラスのドキュメントを参照してください。

46
hamena314

引用 Javadoc

精度は、スケールなしの値の桁数です。

そして

ゼロまたは正の場合、スケールは小数点の右側の桁数です。負の場合、数値のスケールなしの値に10のスケールの否定の累乗が乗算されます。たとえば、スケール-3は、スケールなしの値に1000を掛けることを意味します。

4
Andy Turner

注釈の例では、最大桁数は小数点以下2桁、前9桁(合計11桁)です:123456789,01

1
adranale