Database JAXB,BigDecimal还是double?

Database JAXB,BigDecimal还是double?,database,jaxb,double,bigdecimal,Database,Jaxb,Double,Bigdecimal,我在不同的web服务上工作,并且总是首先使用WSDL JAXB为以下类型生成: <xsd:simpleType name="CurrencyFormatTyp"> <xsd:restriction base="xsd:decimal"> <xsd:totalDigits value="13"/> <xsd:fractionDigits value="2"/> <xsd:minInclus

我在不同的web服务上工作,并且总是首先使用WSDL

JAXB为以下类型生成:

<xsd:simpleType name="CurrencyFormatTyp">
    <xsd:restriction base="xsd:decimal">
        <xsd:totalDigits value="13"/>
        <xsd:fractionDigits value="2"/>
        <xsd:minInclusive value="0.01"/>
    </xsd:restriction>
</xsd:simpleType>
正确的方法是什么

  • 将所有my值转换为double(JAXB绑定从
    BigDecimal
    double
  • 休眠映射
    double
    Bigdecimal

  • 并在一个对象类型中执行所有算术运算。

    您永远不希望使用格式(例如Java中的
    double
    float
    )进行货币运算,因为它们的精度有限,并且设计用于保存从测量中获得的值(在这种情况下,它们一开始就不是绝对精确的,在这种情况下,有限的精度就不是问题了)

    是关于这个主题的文章。这篇文章有点重数学,但理解这一点确实很有帮助(或者,迈克尔·博格沃德链接的文章更容易理解,并且仍然演示/解释了这个问题)

    为避免此类问题,请确保在代码中专门使用
    BigDecimal
    ,并且所有外部存储/传输点也使用定点/任意精度值(即,您的数据库也不应存储浮点数)。

    • 阅读
    • 切勿对金额使用
      double
      float
    • 改用
      BigDecimal
      ,这正是它的用途

    这是一个很好的资源,比我链接的文章更容易找到;-)@Joachim:这正是我写这篇文章的原因:)所以你建议使用BigDecimal类型进行所有计算,并将存储类型保留在doubel(SQL Anywhere DB)。@Alex:不,我不是这么说的。我想说的是:“使用
    BigDecimal
    进行所有计算,并确保使用能够在存储中保持相同精度的数据类型(大多数数据库具有定点数据类型,通常称为“decimal”或类似的数据类型).我将数据库类型转换为十进制,并使用BigDecimal类型进行所有计算。我的问题现在已解决。谢谢。
    <ns5:charge>0.200000000000000011102230246251565404236316680908203125</ns5:charge>        
    <ns5:addcharge>0.0360000000000000042188474935755948536098003387451171875</ns5:addcharge>
    <ns5:tax>0.047199999999999998900879205621095024980604648590087890625</ns5:tax>
    <ns5:totalextax>0.2360000000000000153210777398271602578461170196533203125</ns5:totalextax>