我正在计算纳斯达克指数。
所有股票价格均为小数 我可以将重量减去十倍或两倍 - 这没关系。
nasdaq = weight1 * stock1 + weight2 * stock2 + .... + weightn * stockn。
由于股票价格为十进制,因此将纳达克指数设为十进制似乎是有意义的。但我不希望每次更新某些股票时重新计算纳斯达克指数。相反,我想“缓存”以前的值,然后只计算差异。例如,如果更改了stock2,则:
stock2OldPrice = stocks[2];
diff = stock2 - stock2OldPrice
nasdaq += diff * weight2 // need to synchronize
stocks[2] = stock2
现在我需要同步nasdaq索引,因为可以同时更新股票。例如,我可以并行线程接收MSFT和INTC的新价格。所以我必须写Interlocked.Add(ref nasdaq, diff * weight2);
来引用我之前的问题how to synchronize addition from different threads using lock-free code?但我不能为decimal
执行此操作,因为小数不受支持。
好的,我们可以尝试将nasdaq
索引声明为double
吗?有了双打,我可以做Interlocked.Add
但现在又出现了另一个问题:因为每一步我将从十进制转换为双精度,我将失去精度。然后我的“智能缓存算法”将不会绝对“精确”。这意味着在我的索引的100 000 000更新值变得完全错误后,我无法处理它。
因此无法使用double
和decimal
。
我确实只看到一种可能的解决方案 - 我必须将nasdaq索引声明为decimal
所以我可以继续使用我的“智能缓存算法”,所以我必须使用更复杂的“同步”机制,可能我有使用自旋锁。
你可以看到更简单的解决方案吗?