我从事不同的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>
什么是正确的方法?
BigDecimal
到double
的JAXB绑定)double
到Bigdecimal
并在一个对象类型中执行所有算术运算。
答案 0 :(得分:10)
您不希望使用floating point格式(例如Java中的double
和float
)进行货币操作,因为它们的精确度有限,并且设计用于保存值从某种程度上来源于测量(在这种情况下,它们开始时并不是绝对精确的,在这种情况下,有限的精度不是问题)。
What Every Computer Scientist Should Know About Floating-Point Arithmetic是关于该主题的 文章。它在数学方面有点沉重,但理解这一点确实很有帮助(或者,Michael Borgwardt链接的文章 更容易理解并且仍然可以演示/解释问题)。
要避免此类问题,请确保在代码和中仅使用BigDecimal
,所有外部存储/传输点都使用定点/任意精度值(即您的数据库也不应存储浮点数。)
答案 1 :(得分:7)
double
或float
获取金额BigDecimal
,这正是