BigDecimal,精度和规模

时间:2016-02-16 14:53:31

标签: java jpa scale precision bigdecimal

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

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

@Column(precision = 11, scale = 2)

谢谢!

5 个答案:

答案 0 :(得分:68)

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

<强>精密:

  

precision是未缩放值中的位数。   例如,对于数字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.

<强>规模:

  

如果为零或正,则scale是小数点右边的位数。如果是负数,则将数字的未缩放值乘以10来表示比例的否定。例如,比例为-3表示未缩放的值乘以1000。

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

以下是具有不同比例的相同精度的几个示例:

  • 12345,等级5 = 0.12345
  • 12345,等级4 = 1.2345
  • ...
  • 12345,等级0 = 12345
  • 12345,规模-1 = 123450

BigDecimal.toString:

toString的{​​{1}}方法根据比例和BigDecimal的行为有所不同。 (感谢@RudyVelthuis指出这一点。)

  • 如果precision,整数就会按原样打印出来。
  • 如果scale == 0,则始终使用E-Notation(例如,5级-1产生&#34; 5E + 1&#34;)
  • 如果scale < 0scale >= 0产生一个简单的十进制数(例如10000000 scale 1产生&#34; 1000000.0&#34;)
  • 否则,使用电子符号,例如10比例8产生&#34; 1.0E-7&#34;因为precision - scale -1 >= -6等于unscaledValue*10^{-scale}小于-6。

更多示例:

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

答案 1 :(得分:39)

  • 精确度:有效位总数

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

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

答案 2 :(得分:4)

引用Javadoc

  

精度是未缩放值中的位数。

  

如果为零或正数,则比例是小数点右侧的位数。如果是负数,则将数字的未缩放值乘以10来表示比例的否定。例如,比例为-3表示未缩放的值乘以1000。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

在BigDecimal内包装一个getDouble,将刻度设置为BigDecimal级别

#Calculate the correlation coefficients
corr = dfno.corr(method ='pearson') 
#plot it in the next line
corr.round(2).style.background_gradient(cmap='coolwarm')