【问题标题】:BigDecimal, precision and scaleBigDecimal,精度和规模
【发布时间】:2016-05-27 22:00:32
【问题描述】:

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

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

@Column(precision = 11, scale = 2)

谢谢!

【问题讨论】:

  • 这个问题与java.math.BigDecimal 完全无关。 @javax.persistence.Column 不是 Java SE 的一部分。它是 JPA 的主题。
  • 精度和比例是 java.math.BigDecimal 常用的术语,这是他用于计算的术语,例如 JPA。 ISTM 他或她想知道它们在 BigDecimal 上下文中的含义。

标签: java jpa scale precision bigdecimal


【解决方案1】:

引用Javadoc:

精度是未缩放值的位数。

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

【讨论】:

    【解决方案2】:
    • 精度:有效位数的总数

    • 刻度:小数点右边的位数

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      【解决方案4】:

      BigDecimal 由两个值定义:任意精度整数和 32 位整数 scaleBigDecimal 的值定义为。

      精度:

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

      规模:

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

      这意味着‘BigDecimal’的整数值乘以。

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

      • 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 级 -1 产生“5E+1”)
      • 如果 scale >= 0precision - scale -1 >= -6 生成一个纯十进制数(例如,10000000 比例 1 生成“1000000.0”)
      • 否则,将使用 E 符号,例如10 比例 8 产生“1.0E-7”,因为 precision - scale -1 等于 小于 -6。

      更多示例:

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

      【讨论】:

      • 实际上,[12345, -1] 最好用1.2345E+5 表示,这可能也是ToString 会返回的内容。否则,非常好的解释。
      • 很好的例子解释!
      • 见鬼,我看到我写了ToString。那是 Delphi 说话,而不是 Java。 ;-)
      • 0.12345 - 总共六位数,而不是五位数
      • 你的例子和参考相互矛盾:参考读作If zero or positive, the scale is the number of digits to the right of the decimal point,但在你的例子中,你写了0.12345 // scale = 50.1234 // scale = 5
      猜你喜欢
      • 2012-06-09
      • 2012-07-18
      • 2013-03-05
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      相关资源
      最近更新 更多