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