大十进制、精度和小数位数

2022-08-31 10:33:31

我在应用程序中使用BigDecimal作为我的数字,例如,使用JPA。我对术语“精度”和“尺度”进行了一些研究,但我不明白它们到底是什么。

谁能解释一下BigDecimal值的“精度”和“刻度”的含义?

@Column(precision = 11, scale = 2)

谢谢!


答案 1

A 由两个值定义:任意精度整数和 32 位整数刻度。的值定义为 unscaledValue*10^{-scale}BigDecimalBigDecimal

精度:

精度是未缩放值中的位数。例如,对于数字 123.45,返回的精度为 5。

因此,精度表示任意精度整数的长度。以下是具有相同刻度但精度不同的数字的几个示例:

  • 12345 / 100000 = 0.12345 // 刻度 = 5,精度 = 5
  • 12340 / 100000 = 0.1234 // 刻度 = 5,精度 = 4
  • 1 / 100000 = 0.00001 // 刻度 = 5,精度 = 1

在数字等于零(即0.000)的特殊情况下,精度始终为1。

规模:

如果为零或正,则小数位数为小数点右边的位数。如果为负,则数字的未缩放值乘以 10 的平数的幂。例如,小数位数为 -3 表示未缩放的值乘以 1000。

这意味着“大十进制数”的整数值乘以 10^{-scale}

以下是一些具有相同精度且具有不同刻度的示例:

  • 12345,刻度 5 = 0.12345
  • 12345,刻度 4 = 1.2345
  • ...
  • 12345,小数位数 0 = 12345
  • 12345,刻度为 -1 = 123450

BigDecimal.toString:

的方法的行为因刻度和 不同。(感谢@RudyVelthuis指出这一点。toStringBigDecimalprecision

  • 如果 ,则将按原样打印出整数。scale == 0
  • 如果 ,则始终使用 E 表示法(例如,5 刻度 -1 产生 “5E+1”)scale < 0
  • 如果生成了一个普通的十进制数(例如,10000000 刻度 1 产生“1000000.0”)scale >= 0precision - scale -1 >= -6
  • 否则,使用E表示法,例如10刻度8产生“1.0E-7”,因为等于unscaledValue*10^{-scale}小于-6。precision - scale -1

更多示例:

  • 19/100 = 0.19 // 整数=19,小数位数=2,精度=2
  • 1/1000 = 0.0001 // 整数 =1,小数位数 = 4,精度 = 1

答案 2
  • 精度:有效位总数

  • 规模:小数点右边的位数

有关详细信息,请参阅 BigDecimal 类文档。


推荐