BigDecimal、精度和小数位数

BigDecimal, precision and scale

我在我的应用程序中使用 BigDecimal 作为我的数字,例如,使用 JPA。我对术语 'precision' 和 'scale' 做了一些研究,但我不明白它们到底是什么。

任何人都可以向我解释 'precision' 和 'scale' 对于 BigDecimal 值的含义吗?

@Column(precision = 11, scale = 2)

谢谢!

引用 Javadoc:

The precision is the number of digits in the unscaled value.

If zero or positive, the scale is the number of digits to the right of the decimal point. If negative, the unscaled value of the number is multiplied by ten to the power of the negation of the scale. For example, a scale of -3 means the unscaled value is multiplied by 1000.

  • 精度:总有效位数

  • 比例尺:小数点右边的位数

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

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

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

精度:

The precision is the number of digits in the unscaled value. For instance, for the number 123.45, the precision returned is 5.

所以,precision表示任意精度整数的长度。下面是几个比例相同但精度不同的数字示例:

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

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

规模:

If zero or positive, the scale is the number of digits to the right of the decimal point. If negative, the unscaled value of the number is multiplied by ten to the power of the negation of the scale. For example, a scale of -3 means the unscaled value is multiplied by 1000.

这意味着'BigDecimal'的整数值乘以10^{-scale}

这里有几个精度相同但标度不同的例子:

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

BigDecimal.toString:

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

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

更多例子:

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

精度是数字中有效数字的总数。 小数位数是小数点右边的位数。

示例:

123.456 精度=6 比例=3

10 精度=2 比例=0

-96.9923 精度=6 比例=4

0.0 精度=1 比例=1

负比例

对于负比例值,我们应用以下公式: 结果 = (给定的数字) * 10 ^ (-(标度值)) 示例

给出的数字 = 1234.56

比例=-5

-> (1234.56) * 10^(-(-5))

-> (1234.56) * 10^(+5)

-> 123456000

参考:https://www.logicbig.com/quick-info/programming/precision-and-scale.html