2017-06-04 85 views
0

不可变的,任意精度带符号的十进制数。 BigDecimal由任意精度整数非标定值和32位整数标度组成。如果为零或正数,则标度是小数点右侧的位数。如果是负数,则该数字的非缩放值乘以10乘以该比例否定的幂。由BigDecimal表示的数字的值因此是(无标度值×10标度)。在Java中最喜欢BigDecimal或Double的最常见场景是什么?

这就是文档所说的。根据该文档似乎BigDecimal的我有用,当

  • 您正在处理超大量
  • 您关注的精度

但是否还有其他场景中的BigDecimal是一个更好的选择?

+1

还有哪些不属于您已提及的类别的其他情况? –

+0

我认为你总结得很好。 –

+1

一个问题加上答案......这很好:) –

回答

0

双是一个浮动值,这意味着它不是一个确切的值。因此,您需要使用BigDecimal,它可以为您提供确切的值。 Double将只显示15位重要的十进制数字,但您可以根据需要在BigDecimal中包含尽可能多的有效数字。您可以使用MathContext类设置该值。 BigDecimal用于编写开发应用程序(如科学计算器)的代码。

+2

Double **是**的确切值。 –

+0

https://stackoverflow.com/questions/322749/retain-precision-with-double-in-java查看这个链接和问题中的例子 – thapro

+1

当然双打肯定不能完全代表所有实数。但这并不意味着它们不是确切的价值。对于小数表示也是如此。 –

0

的问题,也许有一些很好的尺寸进行检查,例如金融一个是一个例子,我把它从here,因为我喜欢它:财务问题

货币

底漆计算需要精确到特定的程度,例如大多数货币的小数点后两位数。他们还需要特定类型的舍入行为,例如在税收情况下总是四舍五入。

例如,假设我们有一种产品,其价格为10.00美元,当地销售税为0.0825美元,即8.25%。如果我们的工作是在纸上,税额是,

10.00 * 0.0825 = 0.825

因为我们的货币精度为小数点后两位数字,我们需要倒圆0.825图。另外,因为这是一种税收,所以总是会达到下一个最高分。这样当账户在一天结束时保持平衡的时候,我们从来没有发现自己欠税。

0.825 - > 0.83

所以我们收取客户总的是当地货币10.83和0.83支付给收税。需要注意的是,如果我们卖的这些1000,我们会用这么多多缴收集,

1000 *(0.83 - 0.825)= 5.00

另一个重要的问题是在哪里做的舍入给定的计算。假设我们以0.528361每升售出液态氮。一位顾客进来,买100.00升,所以我们写出来的总价,

100.0 * 0.528361 = 52.8361

因为这不是一种税,我们可以这一轮向上或向下由我们自行决定。假设我们按照标准舍入规则舍入:如果下一个有效数字小于5,则舍入。否则整理。这给了我们最终价格为52.84的数字。

现在假设我们想给整个购买5%的促销折扣。我们是否对52.8361数字或52.84数字应用此折扣?有什么不同?

计算1:52.8361 * 0.95 = 50.194295 = 50.19计算2: 52.84 * 0.95 = 50.198 = 50.20

注意,我们通过使用标准的舍入规则圆形的最后的数字。

看看这两个数字之间有一分之差吗?旧的代码从来不会考虑四舍五入,所以它一直进行计算1中的计算。但是在新代码中,我们总是在应用促销,税收等操作之前进行整理,就像计算2中一样。这是主要原因之一一分钱的错误。

相关问题