我意识到我们应该使用BigDecimal来表示所有的货币值,但是以美元表示的股票价格呢?
我注意到主要供应商的数据馈送应用程序接口使用double类型来表示股票报价。有人知道为什么吗?
这是否意味着我的应用程序可以使用double类型来存储来自这些供应商的股票报价?
发布于 2011-03-13 05:24:44
我在野外工作。从精度的角度来看,BigDecimal显然是理想的,但从性能的角度来看,它很糟糕。在某些情况下,加倍是一种选择(特别是在处理正常股票价格时,加倍很容易-如果采取适当的预防措施-能够代表我经常处理的所有证券交易所的整个价格区间)。
另一种选择是,如果您知道所讨论的交易所使用的DP的范围,则使用固定点和正常的int或long。举一个我很熟悉的例子,Xetra (德国电子交易所)目前最多有3位小数。使用3dp,您可以使用正常的int表示最高2,147,483.647的价格。对于单个价格来说很好,但不适合代表一天的总交易量。
这一切都是关于你正在接收什么数据,这些数据的精度是多少,以及你是如何处理它的。
发布于 2011-03-13 05:44:23
货币不使用二进制浮点的原因是货币使用小数,人们(和会计法规)期望在货币上执行的算术操作中有特定的小数行为-这是二进制浮点所不提供的。
但是,股票报价提要通常不用于记账。它们被显示、比较、用作各种图表分析指标或交易算法的输入-所有这些都比会计更接近科学应用,并且不需要小数行为或精度。相反,由于数据量大,存储效率和性能是相关的,而BigDecimal在这方面真的很糟糕。
发布于 2011-03-13 05:23:53
我反对使用BigDecimal来表示货币价值(通常*)。使用专为与货币一起使用而设计的数据类型(具有最低精度,例如mils表示USD),并且知道如何处理其他规则。这也可以用来防止美元到日元的“意外”转换,等等。Joda Money或timeandmoney就是两个这样的例子。
虽然BigDecimal在解决固定精度问题上比double好得多,但它仍然不是正确的货币表示。(BigDecimal可以是后端,也可以完全替换为另一个impl,作为前端,它不足以表示域。)
祝你编码愉快。
*正如其他人所说,这取决于使用情况。
https://stackoverflow.com/questions/5285505
复制相似问题