JAXB,BigDecimal还是双?

时间:2010-05-10 11:35:50

标签: database jaxb double 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>

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>

什么是正确的方法?

  1. 将我的所有值转换为double(从BigDecimaldouble的JAXB绑定)
  2. Hibernate映射doubleBigdecimal
  3. 并在一个对象类型中执行所有算术运算。

2 个答案:

答案 0 :(得分:10)

您不希望使用floating point格式(例如Java中的doublefloat)进行货币操作,因为它们的精确度有限,并且设计用于保存值从某种程度上来源于测量(在这种情况下,它们开始时并不是绝对精确的,在这种情况下,有限的精度不是问题)。

What Every Computer Scientist Should Know About Floating-Point Arithmetic是关于该主题的 文章。它在数学方面有点沉重,但理解这一点确实很有帮助(或者,Michael Borgwardt链接的文章 更容易理解并且仍然可以演示/解释问题)。

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

答案 1 :(得分:7)

  • 阅读Floating-Point Guide
  • 从不使用doublefloat获取金额
  • 改为使用BigDecimal,这正是
  • 的用途