股票价格的BigDecimal?

Tom*_*ker 5 java stocks decimal

我意识到我们应该BigDecimal用于所有货币价值,但是美元的股票价格呢?

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

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

Mic*_*rdt 10

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

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


Jon*_*ght 7

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

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

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


小智 5

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

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

快乐的编码.

*正如其他人所说,这取决于使用情况.