BigDecimal、精度和小数位数

新手上路,请多包涵

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

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

 @Column(precision = 11, scale = 2)

谢谢!

原文由 jpadilladev 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

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

精确:

精度 是未缩放值中的位数。例如,对于数字 123.45,返回的精度为 5。

因此, 精度 表示任意精度整数的长度。以下是一些具有相同标度但精度不同的数字示例:

  • 12345 / 100000 = 0.12345 // 比例 = 5,精度 = 5
  • 12340 / 100000 = 0.1234 // 比例 = 4,精度 = 4
  • 1 / 100000 = 0.00001 // 比例 = 5,精度 = 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:

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

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

更多示例:

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

原文由 Austin 发布,翻译遵循 CC BY-SA 4.0 许可协议

  • 精度: 有效数字的总数

  • scale: 小数点右边的位数

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

原文由 hamena314 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题