BigDecimal,精度和规模

jpa*_*dev 55 java precision jpa scale bigdecimal

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

任何人都能解释一下BigDecimal值的'precision'和'scale'的含义吗?

@Column(precision = 11, scale = 2)
Run Code Online (Sandbox Code Playgroud)

谢谢!

Aus*_*n D 78

A BigDecimal由两个值定义:任意精度整数和32位整数标度.BigDecimal定义的值是unscaledValue*10 ^ { - 规模}.

精确:

精度是在标度值的位数.例如,对于数字123.45,返回的精度为5.

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

  • 12345/100000 = 0.12345 // scale = 5,precision = 5
  • 12340/100000 = 0.1234 // scale = 5,precision = 4
  • 1/100000 = 0.00001 // scale = 5,precision = 1

在数字等于零(即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 >= 0和生成precision - scale -1 >= -6一个普通的十进制数(例如10000000 scale 1产生"1000000.0")
  • 否则,使用E表示法,例如10等级8产生"1.0E-7",因为precision - scale -1等于unscaledValue*10 ^ { - 规模} 小于-6.

更多例子:

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

  • 您的示例和参考相互矛盾:参考读作“如果为零或正数,则比例是小数点右侧的位数”,但在您的示例中,您写了“0.12345 //比例= 5”和“0.1234” // 比例 = 5` (3认同)
  • 实际上,`[12345,-1]`更好地由`1.2345E + 5`表示,这可能也是`ToString`将返回的.否则,非常好的解释. (2认同)

ham*_*314 48

  • 精度: 有效数字总数

  • 比例:小数点右侧的位数

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


Sha*_*yar 6

精度是数字中有效数字的总数。比例是小数点右侧的位数。

例子:

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