当前位置: 首页 > 知识库问答 >
问题:

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

鲁才艺
2023-03-14

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

这就是文档所说的。根据文档,BigDecimal似乎在以下情况下很有用

  • 你正在处理超大数字

但是还有其他情况下BigDecimal是更好的选择吗?

共有2个答案

韩弘阔
2023-03-14

这个问题可能有一些很好的大小需要检查,例如金融问题就是一个例子,我将从这里开始,因为我喜欢它:

财务问题入门

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

例如,假设我们有一种产品,在给定货币中价格为10.00,当地销售税为0.0825,或8.25%。如果我们在纸上计算出来,税额是,

10.00 * 0.0825 = 0.825

因为我们对货币的精度是小数点后两位数,我们需要将0.825位四舍五入。此外,因为这是一种税,所以最好总是将四舍五入到下一个最高的美分。这样,当账户在一天结束时达到平衡时,我们就不会发现自己纳税不足。

0.825 -

所以我们向客户收取的总费用是当地货币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中一样。这是1美分误差的主要原因之一。

苗信鸥
2023-03-14

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

 类似资料:
  • 问题内容: 我正在尝试设置禁用输入的样式。我可以用: 要么 属性选择器是现代CSS3方式还是前进的方式?我曾经使用伪类,但是找不到关于它们是否是旧方法并且将不被支持或者它们是否相等的任何信息,您可以使用最喜欢的任何方法。 我不需要支持较旧的浏览器(这是一个Intranet应用程序),因此: 属性是更新更好的 伪类仍然是要走的路 无论您最喜欢哪个 有一个技术上的理由要使用另一个 问题答案: 属性选择

  • 问题内容: 建议在处理现实世界的货币值时,使用BigDecimal而不是Double。但是我没有令人信服的解释,只是“通常是这样做的”。 您能谈谈这个问题吗? 问题答案: 这称为精度损失,在处理非常大的数字或非常小的数字时非常明显。在许多情况下,带小数的十进制数字的二进制表示形式是近似值,而不是绝对值。要了解为什么需要阅读二进制形式的浮点数表示形式。这是链接:http : //en.wikiped

  • 从外观上看-似乎创建了一个对象的克隆。如果是这样,那么对于实现可克隆接口(只有不可变对象是新的,因为可变对象有引用复制)的关注,哪一个是最好的,为什么? 我昨天实现了克隆,然后意识到我必须为非字符串/首字母元素提供自己的修改。然后我被告知我现在正在使用的。这两个实现似乎都提供了类似的功能。 谢谢

  • 本文向大家介绍Proxy是什么,有什么应用场景?相关面试题,主要包含被问及Proxy是什么,有什么应用场景?时的应答技巧和注意事项,需要的朋友参考一下 Proxy做数据劫持用的,和Object.defineProperty类似 可以直接监听对象,而非其属性 不过功能更强大,能监听数组,包含get, set, has, defineProperty, has, deleteProperty等十三个强

  • 本文向大家介绍Reflect是什么,有什么应用场景?相关面试题,主要包含被问及Reflect是什么,有什么应用场景?时的应答技巧和注意事项,需要的朋友参考一下 1.将Object对象的一些明显属于语言内部的方法(比如Object.defineProperty),放到Reflect对象上。 修改某些Object方法的返回结果,让其变得更合理。比如,Object.defineProperty(obj,

  • 本文向大家介绍 什么是断言?应用场景?相关面试题,主要包含被问及 什么是断言?应用场景?时的应答技巧和注意事项,需要的朋友参考一下