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

在Java中,最常见的场景是什么,人们应该选择BigDecimal还是Double?,java,math,Java,Math,不可变、任意精度有符号十进制数。BigDecimal由一个任意精度的整数无标度值和一个32位整数标度组成。如果为零或正,则刻度为小数点右侧的位数。如果为负数,则数字的未标度值乘以10,即标度的负数幂。因此,由BigDecimal表示的数字值为(无标度值×10标度) 医生是这么说的。根据文档,BigDecimal在以下情况下似乎很有用: 您正在处理超大数字 你关心的是精确性 但是,是否还有其他情况下BigDecimal是更好的选择 Double是一个浮点值,意味着它不是一个精确的值。因此,您需

不可变、任意精度有符号十进制数。BigDecimal由一个任意精度的整数无标度值和一个32位整数标度组成。如果为零或正,则刻度为小数点右侧的位数。如果为负数,则数字的未标度值乘以10,即标度的负数幂。因此,由BigDecimal表示的数字值为(无标度值×10标度)

医生是这么说的。根据文档,BigDecimal在以下情况下似乎很有用:

  • 您正在处理超大数字
  • 你关心的是精确性

但是,是否还有其他情况下BigDecimal是更好的选择

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

这个问题可能有一些好的尺寸需要检查,例如金融问题就是一个例子,我将从中选取它,因为我喜欢它:

财务问题入门

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

例如,假设我们有一种产品,以给定货币计价,价格为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升,所以我们写下了总价

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

还有什么场景不属于你已经提到的类别?我认为你总结得很好。一个问题加上答案。。。这很好:)一个常见的场景(如果你读到字里行间的话,这里已经有了)就是钱。使用
BigDecimal
时,税收、附加费或仅仅计算每日收益都会更好,因为需要一个精确的答案。@ElliottFrisch是的,我刚才读了一点关于其中一个例子的内容,你的观点作为例子是完美的。Double是一个精确的值。查看此链接,问题中的示例askedDoubles当然不能准确表示所有实数。但这并不意味着它们不是精确的值。十进制表示法也是如此。