股票价格的BigDecimal?

时间:2011-03-12 21:08:44

标签: java decimal stocks

我意识到我们应该使用BigDecimal来获取所有货币价值,但是以美元计算股票价格呢?

我注意到主要供应商的数据Feed API使用类型double作为股票报价。有谁知道为什么?

这是否意味着我的应用程序可以使用类型double来存储来自这些供应商的股票报价?

5 个答案:

答案 0 :(得分:10)

不使用二进制浮点数的原因是货币使用小数分数,人们(和会计规则)期望对其执行的算术运算产生特定的十进制行为 - 二进制浮点数不提供。

但是,股票报价Feed通常不用于会计。它们被显示,比较,用作各种图表分析指标或交易算法的输入 - 所有这些都比科学应用更接近于会计,并且不需要小数行为或精度。相反,由于大量数据,存储效率和性能是相关的,BigDecimal真的很糟糕。

答案 1 :(得分:7)

我在外地工作。从精确的角度来看,BigDecimal显然是理想的,但从性能的角度来看却很糟糕。在某些情况下,双打是一种选择(特别是在处理正常的股票价格时,双打很容易 - 采取适当的预防措施 - 能够代表我经常处理的所有股权交易的价格范围的全部。)

另一种选择是,如果您知道有问题的交易所使用的DP范围,则使用定点和普通的int或long。举一个我熟悉的例子,Xetra(德国电子交易所)目前最多有3个小数位。使用3dp,您可以使用正常的int表示高达2,147,483.647的价格。对于单个价格来说很好,对于代表一天的交易总数没有好处。

这是一个问题,即您接收的数据,数据的精确度以及处理方式。

答案 2 :(得分:5)

我拒绝使用BigDecimal作为货币价值(通常为*)。使用数据类型设计的与货币一起使用(具有最小精度,例如美元的mils),并知道如何处理其他规则。这也可用于防止美元“日元”意外转换等。 Joda Moneytimeandmoney就是两个这样的例子。

虽然BigDecimal远远优于用于解决固定精度的双倍,但它仍然不是IMOHO的正确货币表示。 (BigDecimal可能是后端[或者它可以完全替换为另一个impl。],因为前端它不能充分代表域。)

快乐的编码。

*正如其他人所说,这取决于用途。

答案 3 :(得分:3)

就个人而言,我会坚持BigDecimal。供应商 使用双打有点令人不安,但没有理由为什么你应该传播他们的错误。你会从“稍微糟糕”的数据开始,但至少你不会在你用的任何事情中引入进一步的意外行为。

您可能想与供应商交谈并找出为什么他们正在使用双打......

答案 4 :(得分:0)

猜测:

  

我注意到主要供应商的数据Feed API使用double类型作为股票报价。有谁知道为什么?

当这样的API使用基于文本的格式(如XML或JSON)时,传输的数据实际上不是双倍的,但十进制数字和十进制数字就是这里的含义。并且double通常是唯一支持其中一些API中十进制数字(点后面的数字)的数据类型。

当你收到一个股票价格为双倍并想要以“金钱方式”计算它时,请确保你知道它有多少十进制数字(在点之后)(应该有 - 不是来自双倍,而是来自股票价格的类型,并将其与此比例转换为BigDecimal(或您用于金钱计算的任何东西)。