Java 股票价格的大小数?

Java 股票价格的大小数?,java,decimal,stocks,Java,Decimal,Stocks,我意识到我们应该对所有的货币价值使用BigDecimal,但是美元的股票价格呢 我注意到,来自主要供应商的数据提要API对股票报价使用了类型double。有人知道为什么吗 这是否意味着我的应用程序可以使用类型double来存储来自这些供应商的股票报价?就个人而言,我会坚持使用BigDecimal。有些令人不安的是,供应商正在使用double,但没有理由宣传他们的错误。您将从“稍差”的数据开始,但至少不会在对值所做的任何操作中引入更多意外行为 您可能想和供应商谈谈,了解他们为什么使用double…

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

我注意到,来自主要供应商的数据提要API对股票报价使用了类型
double
。有人知道为什么吗


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

就个人而言,我会坚持使用
BigDecimal
。有些令人不安的是,供应商正在使用double,但没有理由宣传他们的错误。您将从“稍差”的数据开始,但至少不会在对值所做的任何操作中引入更多意外行为


您可能想和供应商谈谈,了解他们为什么使用double…

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

虽然BigDecimal远远优于double来处理固定精度,但它仍然不是正确的货币表示形式。(BigDecimal可能是后端[也可能被另一个impl.完全取代],作为前端,它不能充分表示域。)

快乐编码


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

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

另一种选择是,如果您知道相关交易所使用的DP范围,则使用定点和正常整数或长整数。举个我很熟悉的例子,Xetra(德国电子交易所)目前最多只有3位小数。使用3dp,您可以用正常整数表示高达2147483.647的价格。对单个价格罚款,对表示一天交易总额没有好处


这完全是一个你接收到什么数据、数据的精度以及你如何处理它的问题。

货币不使用二进制浮点的原因是货币使用小数和人(以及会计规则)对其执行的算术运算需要特定的十进制行为-二进制浮点不提供这种行为

然而,股票报价提要通常不用于会计。它们被显示、比较、用作各种图表分析指标或交易算法的输入——所有这些都比会计更接近科学应用,不需要十进制行为或精度。相反,由于数据量大,存储效率和性能是相关的,
BigDecimal
在这些方面真的很差劲。

关于这一点的猜测:

我注意到,来自主要供应商的数据提要API使用double类型进行股票报价。有人知道为什么吗

当这样的API使用基于文本的格式(如XML或JSON)时,传输的数据实际上不是双精度的,而是十进制数——这里的意思是十进制数。在某些API中,double通常是唯一支持十进制数(小数点后有数字)的数据类型


当你收到一个双精度的股票价格并想“以金钱的方式”计算它时,确保你知道它有多少小数位数(在点之后)(应该有-不是从双精度,而是从股票价格的类型),并用这个比例将它转换成一个双精度的小数位数(或任何你用于金钱计算的数字).

只要你除了传递/显示价值(在股票价格中很常见)之外,不做任何其他事情,保持双倍没有坏处。虽然我不太同意在Dev Days London(包括关于浮点的一节,如果我没记错的话)上发表如此精彩演讲的人的观点,但是在Web服务/REST Api中没有方法表示
BigDecimal
。如果不使用double,那么用这种格式表示货币的最佳方式是什么?@精英先生:我可能会提供一个使用十进制字符串的API,它使用不变区域性(即,一种几乎可以用任何语言解析的方式)。这确实取决于你用它做什么。如果你不打算对它执行任何操作,除了显示它,你显然不会丢失任何信息。另一个很好的答案。BigDecimal不适用于引号。