Я полностью озадачен и не могу найти что-либо в Интернете об этом, так что я должен делать что-то неправильно?
_positionsRepo.GetAllTrades().OrderByDescending(x => x.TotalPLPercent).ToList();
TotalPLPercent - это десятичное поле. результат упорядочивается следующим образом:
96.76
95.54
8.54
75.55
231.22
13
Очевидно, это неправильно. Я проверил сортировку против другого поля, которое было двойным, и работало, как ожидалось. Что мне не хватает здесь о десятичных знаках в С#?
Я использую драйвер Mongo DB С#.
Драйвер С# Mongo DB сериализует decimal
строку в виде строки (исходный код драйвера подтверждает это).
Он делает это, потому что нет типа BSON для десятичного числа - double не имеет такой же точности. К сожалению, это означает, что вы не можете сравнивать "десятичные" значения как числа.
Вы можете сортировать данные в памяти, например:
_positionsRepo.GetAllTrades()
.ToList()
.OrderByDescending(x => x.TotalPLPercent)
.ToList();
Другим вариантом было бы хранить количество центов (или сотых долей) как длинное целое число. Затем вы можете сортировать их нормально, и вам просто нужно разделить на 100 (или 10 000), чтобы получить реальную ценность.
По-видимому, это проблема с MongoDB Driver for C#
. Проверьте этот открытый вопрос здесь -
тип "System.Decimal" сохраняет как "String"
Как вы можете видеть, поскольку Decimal
сохраняется как String
, он, несомненно, будет сортироваться как строка. Я думаю, вы должны попробовать double
вместо decimal
пока они не исправит эту проблему.
double
для значений валюты - вы получаете ошибки округления с плавающей запятой.
Вы уверены, что тип x равен десятичному? Похоже, он делает строковый порядок. (Я бы поставил точку останова на "x.TotalPLPercent", а затем оценил тип x, чтобы дважды проверить его, как я думал.)
.ToList().
междуGetAllTrades()
иOrderByDescending()
. Таким образом, список будет отсортирован в памяти, а не в базе данных (я подозреваю, что это как-то связано с этим).