BigDecimal,精度和规模
Posted
技术标签:
【中文标题】BigDecimal,精度和规模【英文标题】:BigDecimal, precision and scale 【发布时间】: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 上下文中的含义。
【参考方案1】:
引用Javadoc:
精度是未缩放值的位数。
和
如果为零或正数,则小数点为小数点右侧的位数。如果为负数,则将数字的未缩放值乘以 10 的负数次方。例如,-3 的比例表示未缩放的值乘以 1000。
【讨论】:
【参考方案2】:精度:有效位数的总数
刻度:小数点右边的位数
有关详细信息,请参阅BigDecimal
类文档。
【讨论】:
【参考方案3】:从您的示例注释中,最大位数为小数点后 2 位和小数点前 9 位(共 11 位):
123456789,01
【讨论】:
你能帮我解决这个问题吗***.com/questions/54780779/…【参考方案4】:BigDecimal
由两个值定义:任意精度整数和 32 位整数 scale。 BigDecimal
的值定义为。
精度:
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:
BigDecimal
的 toString
方法根据比例和 precision
表现不同。 (感谢@RudyVelthuis 指出这一点。)
scale == 0
,整数会按原样打印出来。
如果scale < 0
,则始终使用 E-Notation(例如,5 级 -1 产生“5E+1”)
如果 scale >= 0
和 precision - 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 = 5
和0.1234 // scale = 5
以上是关于BigDecimal,精度和规模的主要内容,如果未能解决你的问题,请参考以下文章