我正在使用金钱,所以我需要我的结果是准确的,但我只需要 2 个小数点(美分)的精度。是否需要 BigDecimal 来保证乘法/除法的结果是准确的?
5 回答
BigDecimal 是一种非常适合小数点算术的类型,小数点后位数已知。您可以使用整数类型并自己跟踪乘数,但这涉及在您的代码中进行可以自动化的工作。
除了管理小数点后的数字外,BigDecimal 还将根据需要扩展存储的位数 - 许多商业和政府财务计算涉及的总和太大而无法以美分存储在 int 中。
只有当您需要存储大量资金并且内存不足时,我才会考虑避免使用它。
一种常见的选择是使用整数或长整数(美分值)进行所有计算,然后在需要显示时简单地添加两位小数。
同样,还有一个JODA Money库,它将为您提供功能更全面的货币计算 API。
这取决于您的应用程序。使用该精度级别的一个原因是防止在许多操作中累积的错误渗入并导致有价值信息的丢失。如果您正在创建一个临时应用程序和/或仅将其用于数据输入,那么 BigDecimal 很可能是矫枉过正。
为 Patricias 回答 +1,但我非常不鼓励任何人使用具有固定位长的整数数据类型来实现自己的类,只要有人真的不知道你在做什么。BigDecimal 支持所有舍入和精度问题,而 long/int 存在严重问题:
小数位数未知:贸易交易所/法律/商业的小数位数数量不同,因此您不知道将来是否必须更改和调整您选择的位数。更糟糕的是:有些事情,比如股票评估,需要大量的小数。一艘载有 1000 公吨煤的船会产生 4.12 欧元的冰费,即 0,000412 欧元/吨。
未实现的运算:这意味着人们很可能使用浮点数进行舍入/除法或其他算术运算,隐藏不精确性并导致所有已知的浮点算术问题。
上溢/下溢:达到最大数量后,添加数量会导致符号改变。Long.MAX_VALUE 切换到 Long.MIN_VALUE。如果您正在做像 (a*b*c*d)/(e*f) 这样的分数,这可能很容易发生,这可能完全有效地导致 long 范围内的结果,但中间提名者或分母不是。
您可以编写自己的Currency
课程,使用 along
来保存金额。类方法将使用String
.
无论您使用 along
还是 a ,除法都将是一个问题BigDecimal
。您必须根据具体情况确定您对小数美分的处理方式。丢弃它们、舍弃它们或保存它们(除了您自己的帐户之外)。