JAXB,BigDecimal还是双?

Ale*_*lex 4 database double jaxb bigdecimal

我从事不同的Web服务,我总是使用WSDL First.

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>
Run Code Online (Sandbox Code Playgroud)

Java绑定类型BigDecimal(如JAXB规范中所述).

然后,当我使用类型的值double(存储在数据库中并通过hibernate映射到double类型)进行一些简单的算术运算时,我遇到了麻烦.

<ns5:charge>0.200000000000000011102230246251565404236316680908203125</ns5:charge>        
<ns5:addcharge>0.0360000000000000042188474935755948536098003387451171875</ns5:addcharge>
<ns5:tax>0.047199999999999998900879205621095024980604648590087890625</ns5:tax>
<ns5:totalextax>0.2360000000000000153210777398271602578461170196533203125</ns5:totalextax>
Run Code Online (Sandbox Code Playgroud)

什么是正确的方法?

  1. 将我的所有值转换为double(从JAXB绑定BigDecimaldouble)
  2. Hibernate映射doubleBigdecimal

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

Joa*_*uer 10

你永远不希望使用浮点格式(如doublefloat货币业务在Java中),因为他们已经精度的限制,并已设计成认为,在某种程度上,从测量得到的值(在这种情况下,它们不是绝对精确首先,在这种情况下,有限的精度不是一个问题).

每个计算机科学家应该知道什么关于浮点运算是关于这个主题文章.这是对数学有点重,但它确实有助于理解(或者,由迈克尔博格瓦特链接到文章是很多容易理解,仍然证明/说明问题).

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


Mic*_*rdt 7

  • 阅读浮点指南
  • 永远不要使用doublefloat金额
  • BigDecimal相反,请使用,这正是它的用途