Java精确计算 - 要使用的选项

时间:2013-04-26 10:23:30

标签: java double precision bigdecimal formulas

我正在尝试建立一些简洁的概述,了解我们在JAVA + SQL中使用的精确计算方法。到目前为止,我找到了以下选项:

  1. 使用双打接受他们的缺点,不去。
  2. 使用BigDecimals
    • 在复杂的公式中使用它们对我来说是个问题
  3. 使用String.format / Decimal.format来舍入双打
    • 我需要对公式中的每个变量进行舍入,还是只得到结果以获得BigDecimal精度?
    • 怎么可以调整?
  4. 在SQL中使用计算字段选项。
    • 缺点是我需要动态SQL从不同的表中提取数据+计算其他计算字段中的字段并且会变得混乱
  5. 还有其他选择吗?

    问题陈述: 我需要精确的财务计算,包括使用非常大(数十亿)和非常小的数字(0.0000004321),以及除以彼此非常相似的值,所以我确实需要BigDecimal的精度。

    另一方面,我想保留双功能在功能中的易用性(我使用十进制SQL数据处理数组),所以计算如:(a [i] - b [i])/ b [i在其他计算中进一步使用的等等。并且我希望用户能够根据需要设置自己的公式(使用常见的数学语句)

    我热衷于为String.format使用“格式化”解决方案,但是这使得代码不太可读(对每个变量使用String.format()......)。

    非常感谢有关如何处理这些内容的建议。

4 个答案:

答案 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中重载运算符,我认为这是不可能的。