BigDecimal、精度和小数位数

IT小君   2021-11-07T03:59:32

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

谁能向我解释 BigDecimal 值的“精度”和“比例”的含义?

@Column(precision = 11, scale = 2)

谢谢!

评论(4)
IT小君

ABigDecimal由两个值定义:任意精度整数和 32 位整数scale的值BigDecimal定义为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(即 0.000)的特殊情况下,精度始终为 1。

规模:

如果为零或正数,则刻度是小数点右侧的位数。如果为负数,则数字的未换算值乘以 10 的取反乘幂。例如,比例为 -3 表示未缩放的值乘以 1000。

这意味着“BigDecimal”的整数值乘以10^{-比例}

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

  • 12345 比例 5 = 0.12345
  • 12345 比例 4 = 1.2345
  • 12345 比例为 0 = 12345
  • 12345 带刻度 -1 = 123450

BigDecimal.toString:

a 的toString方法BigDecimal根据比例和 表现不同precision(感谢@RudyVelthuis 指出这一点。)

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

更多例子:

  • 19/100 = 0.19 // 整数=19,小数位数=2,精度=2
  • 1/1000 = 0.0001 // 整数 = 1,小数位数 = 4,精度 = 1
2021-11-07T03:59:32   回复
IT小君
  • 精度: 有效数字的总数

  • Scale:小数点右边的位数

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

2021-11-07T03:59:33   回复
IT小君

引用Javadoc

精度是未换算值中的位数。

如果为零或正数,则刻度是小数点右侧的位数。如果为负数,则数字的未换算值乘以 10 的取反乘幂。例如,比例为 -3 表示未缩放的值乘以 1000。

2021-11-07T03:59:33   回复
IT小君

从您的示例注释中,最大位数是小数点后 2 位,小数点前 9 位(总共 11 位): 123456789,01

2021-11-07T03:59:33   回复