我正在尝试建立一些简洁的概述,了解我们在JAVA + SQL中使用的精确计算方法。到目前为止,我找到了以下选项:
还有其他选择吗?
问题陈述: 我需要精确的财务计算,包括使用非常大(数十亿)和非常小的数字(0.0000004321),以及除以彼此非常相似的值,所以我确实需要BigDecimal的精度。
另一方面,我想保留双功能在功能中的易用性(我使用十进制SQL数据处理数组),所以计算如:(a [i] - b [i])/ b [i在其他计算中进一步使用的等等。并且我希望用户能够根据需要设置自己的公式(使用常见的数学语句)
我热衷于为String.format使用“格式化”解决方案,但是这使得代码不太可读(对每个变量使用String.format()......)。
非常感谢有关如何处理这些内容的建议。
答案 0 :(得分:2)
在 float 和 double 中,无法避免浮点错误。 这里没有免费的奶酪 - 使用BigDecimal。
答案 1 :(得分:2)
来自 Effective Java(第二次ED):
第48项:如果需要确切答案,请避免浮动并加倍
Float和double不提供准确的结果,不应在需要确切结果的地方使用。 浮动和双重类型特别不适合货币计算,因为不可能将0.1(或任何其他10的负幂)表示为浮点数或双精度数。
解决此问题的正确方法是使用BigDecimal,int或long进行货币计算。
...
另一种方法是使用int或long并自己跟踪小数点。
答案 2 :(得分:0)
无法在BigDecimal
上获得double
精度。 double
具有双精度。
如果您想确保使用BigDecimal
确保精确结果。
你可以创建自己的变体,使用long
来存储整数部分,使用int
来存储小数部分 - 但为什么要重新发明轮子。
任何时间都会使用double
来解决双精度问题。如果你在一个地方使用它们,你可以在任何地方使用它们。
即使您只使用它们来表示数据库中的数据,也会将数据四舍五入到精度,并且您将丢失信息。
答案 3 :(得分:0)
如果我理解您的问题,您希望使用比原生Java更精确的数据类型,而不会丢失简单的数学语法(例如/ + * - 等等)。由于你不能在Java中重载运算符,我认为这是不可能的。