Биржевой индекс должен быть двойным или десятичным?

Я рассчитываю, скажем, NASDAQ, индекс.

Все цены на акции являются десятичными, я могу сделать вес десятичным или двойным - это не имеет значения.

nasdaq = вес1 * сток1 + вес2 * сток2 + .... + весн * стокн.

Поскольку цена акций является десятичной, представляется целесообразным сделать десятичный индекс nasdaq. Но я не хочу пересчитывать индекс nasdaq каждый раз, когда некоторые акции обновляются. Вместо этого я хочу "кэшировать" предыдущее значение, а затем только вычислять разницу. Например, если изменяется 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); обратитесь к моему предыдущему вопросу, как синхронизировать добавление из разных потоков, используя код без блокировки? Однако я не могу сделать это для decimal потому что десятичные дроби не поддерживаются.

Хорошо, давайте попробуем объявить nasdaq индекс как double? С дублями я могу сделать Interlocked.Add но теперь другая проблема: потому что на каждом шаге я буду конвертировать из десятичной в двойную, я буду терять точность. И тогда мой "умный алгоритм кеширования" не будет абсолютно "точным". Это означает, что после 100 000 000 обновлений значение моего индекса становится совершенно неправильным, я не могу с этим справиться.

Так что невозможно использовать ни double ни decimal,

Я вижу только одно возможное решение - я должен объявить индекс NASDAQ как decimal поэтому я могу продолжать использовать свой "интеллектуальный алгоритм кэширования", и поэтому мне придется использовать более сложный механизм "синхронизации", вероятно, мне придется использовать спин-блокировки.

Возможно, вы можете увидеть более простое решение?

0 ответов

Другие вопросы по тегам