在Java中,人们应该更喜欢BigDecimal还是Double?最常见的场景是什么?

时间:2017-06-04 19:49:28

标签: java math

  

不可变,任意精度的带符号十进制数。 BigDecimal由任意精度整数非标度值和32位整数标度组成。如果为零或正数,则比例是小数点右侧的位数。如果是负数,则将数字的未缩放值乘以10来表示比例的否定。因此,BigDecimal表示的数字的值是(unscaledValue×10-scale)。

这就是文档所说的。基于文档,看起来BigDecimal在

时很有用
  • 你正在处理超大数字
  • 您关注精确度

但是还有其他场景,BigDecimal是更好的选择吗?

2 个答案:

答案 0 :(得分:0)

Double是浮点值,意味着它不是精确值。因此,您需要使用BigDecimal,它会为您提供准确的值。 Double将仅显示15个有效十进制数字,但您可以在BigDecimal中拥有任意数量的有效数字。您可以使用MathContext类设置值。 当您编写用于开发科学计算器等应用程序的代码时,会使用BigDecimal。

答案 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中一样。这是主要原因之一一分钱的错误。