Java精确计算-使用选项

Java精确计算-使用选项,java,double,precision,bigdecimal,formulas,Java,Double,Precision,Bigdecimal,Formulas,我试图对JAVA+SQL中的精确计算选项建立一些简明的概述。到目前为止,我找到了以下选择: 使用替身,接受他们的缺点,不去 使用大小数 在复杂的公式中使用它们对我来说是有问题的 使用String.format/Decimal.format将双精度四舍五入 我需要对公式中的每个变量进行四舍五入,还是只对结果进行四舍五入以获得更大的十进制精度 如何调整这一点 在SQL中使用计算字段选项。 缺点是,我需要动态SQL从不同的表中提取数据,并在其他计算字段中提取计算字段,这将变得混乱 还有其他

我试图对JAVA+SQL中的精确计算选项建立一些简明的概述。到目前为止,我找到了以下选择:

  • 使用替身,接受他们的缺点,不去
  • 使用大小数
    • 在复杂的公式中使用它们对我来说是有问题的
  • 使用String.format/Decimal.format将双精度四舍五入
    • 我需要对公式中的每个变量进行四舍五入,还是只对结果进行四舍五入以获得更大的十进制精度
    • 如何调整这一点
  • 在SQL中使用计算字段选项。
    • 缺点是,我需要动态SQL从不同的表中提取数据,并在其他计算字段中提取计算字段,这将变得混乱
  • 还有其他选择吗

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

    另一方面,我希望保留double函数中的易用性(我使用十进制SQL数据处理数组),因此,类似于:(a[I]-b[I])/b[I]等的计算将在其他计算中进一步使用。我希望用户能够根据需要设计自己的公式(使用常用的数学语句)

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


    非常感谢你对如何处理这些东西的建议

    无法在
    double
    上获得
    BigDecimal
    精度<代码>双精度s具有双精度

    如果要保证精确的结果,请使用
    BigDecimal

    您可以使用
    long
    来存储整数部分,使用
    int
    来存储小数部分,来创建您自己的变体-但是为什么要重新发明轮子呢

    Any时间使用
    double
    s您可以避免填充器出现双精度问题。如果你在一个地方使用它们,你也可以在任何地方使用它们


    即使只使用它们表示数据库中的数据,也会将数据四舍五入到双精度,从而丢失信息。

    无法在
    双精度上获得
    bigdecimic
    精度<代码>双精度
    s具有双精度

    如果要保证精确的结果,请使用
    BigDecimal

    您可以使用
    long
    来存储整数部分,使用
    int
    来存储小数部分,来创建您自己的变体-但是为什么要重新发明轮子呢

    Any时间使用
    double
    s您可以避免填充器出现双精度问题。如果你在一个地方使用它们,你也可以在任何地方使用它们

    即使只使用它们表示数据库中的数据,也会将数据舍入到双精度,并且会丢失信息。

    floatdouble中无法避免浮点错误。 这里没有免费奶酪-使用BigDecimal。

    floatdouble中,您无法避免浮点错误。
    这里没有免费的奶酪-使用BigDecimal。

    如果我理解您的问题,您希望使用比本机Java更精确的数据类型,而不丢失简单的数学语法(例如/+*-等等)。由于Java中不能重载运算符,我认为这是不可能的。

    如果我理解您的问题,您希望使用比本机Java更精确的数据类型,而不丢失简单的数学语法(例如/+*-等等)。由于不能在Java中重载运算符,我认为这是不可能的。

    来自《有效Java》(第二版):

    第48项:如果需要准确答案,请避免浮动和双精度

    • Float和double不能提供精确的结果,因此不应在需要精确结果的地方使用。 float和double类型特别不适合于货币计算,因为不可能精确地将0.1(或任何其他10的负幂)表示为float或double

    • 解决此问题的正确方法是使用BigDecimal、int或long进行货币计算

    另一种方法是使用int或long,并自己跟踪小数点

    摘自《有效Java》(第二版):

    第48项:如果需要准确答案,请避免浮动和双精度

    • Float和double不能提供精确的结果,因此不应在需要精确结果的地方使用。 float和double类型特别不适合于货币计算,因为不可能精确地将0.1(或任何其他10的负幂)表示为float或double

    • 解决此问题的正确方法是使用BigDecimal、int或long进行货币计算

    另一种方法是使用int或long,并自己跟踪小数点


    这可能有助于。。。如果设计破坏了您的需求,请返回分析阶段。任何没有固定的、强制性的和详尽的定义何时以及如何应用舍入的金融工具都会被第一个或第二个使用它的人视为计算错误。这可能有助于。。。如果设计破坏了您的需求,请返回分析阶段。任何没有固定的、强制性的和详尽的定义何时以及如何应用舍入的金融工具都会被第一个或第二个使用它的人视为计算错误。@Eugene,好的,谢谢你的评论,但是让我们挑战大小数。要使下面的示例代码正常工作,需要什么我知道这是不正确的语法,但我想有这个