преобразование
blockquote>long
(или любой другой тип данных, представляющий число) вdouble
теряет точность. Это вполне очевидно из-за представления чисел с плавающей запятой.Это менее очевидно, чем кажется, поскольку точность потерь зависит от значения
long
. Для значений от -252 до 252 потери точности вообще отсутствуют.Насколько велика потеря точности, если я конвертирую большее число в двойное? Должен ли я ожидать различий, превышающих +/- X
blockquote>. Для чисел с величиной выше 252 вы будете испытывать некоторую потерю точности, в зависимости от того, насколько выше 52-битного предела. Если абсолютное значение вашего
long
соответствует, скажем, 58 бит, тогда величина вашей точности будет 58-52 = 6 бит или +/- 64.blockquote>
decimal
более подходит для этой задачи?
decimal
имеет другое представление, чемdouble
, и использует другую базу. Поскольку вы планируете разделить свой номер на «небольшие числа», разные представления будут давать вам разные ошибки при разделении. В частности,double
будет лучше обрабатывать деление по степеням двух (2, 4, 8, 16 и т. Д.), Поскольку такое деление может быть выполнено путем вычитания из показателя, не касаясь мантиссы. Точно так же большиеdecimal
s не потеряли бы значительных цифр при делении на десять, сотню и т. Д.
Я понимаю, что вопрос старый, но в интересах помощи всем, кто найдет это через поиск, стоит отметить, что .net v4 включает новый кэш общего назначения для такого типа сценариев. Он находится в пространстве имен System.Runtime.Caching:
https://msdn.microsoft.com/en-us/library/dd997357(v=vs.110).aspx
Статическая ссылка на экземпляр кэша по умолчанию: MemoryCache.Default
Кажется, нет ничего в текущих версиях Системы. Сеть. Кэширование. Кэш, которые зависят от времени выполнения HTTP за исключением Insert()
метод, который принимает CacheItemUpdateCallback
, таким образом, Scott прав по большей части.
Это не препятствует тому, чтобы Microsoft изменила класс в будущем, которое будет более интегрировано с инфраструктурой HTTP.
я записал находящийся в WeakReference легкий кэш в другом ответе.
Я когда-то использовал его, но это не чувствовало себя хорошо, и IIRC увеличил объем потребляемой памяти вполне существенно. Вместо этого я реализовал свой собственный легкий механизм кэширования, который удивительно легко сделать.
Это использовало класс WeakReference , который позволил кэшу сохранять ссылки на объект, но также и позволяет Сборщику "мусора" исправлять память, если ссылка не использована.
единственной вещью, которую я не имел, был отдельный поток для чистки устаревших объектов в кэше. То, что я действительно делал, - то, если бы кэш имел> x объекты в нем, я прошел бы все кэшируемые элементы и покрыл бы дерном старые объекты прежде, чем добавить новый объект.
при необходимости в чем-то более устойчивом используйте что-то как Библиотека MS Enterprise Блок Программы кэширования .
Не должно быть никакой проблемы с использованием HttpRuntime. Кэш. Это - сложная хеш-таблица в оперативной памяти, которая может быть очень полезной за пределами веб-контекста. Однако, это могло бы быть что-то вроде запаха кода для ссылки на HttpRuntime. Кэш в non-Http связал приложение, таким образом, это может быть хорошая идея обернуть его позади некоторого интерфейса ICache и использования это по мере возможности.
Одна вещь иметь в виду состоит в том, что Microsoft имеет выпущенный Клиентский Установочный пакет Профиля Платформы.NET. Это - версия 3,5 платформ, которые предназначены для клиентских приложений и имеют уменьшенное место. Клиентский Профиль не включает части ASP.NET платформы.
, Если Ваше приложение зависит от Системы. Сеть это остановит Вашу способность приложения использовать в своих интересах Клиентский Профиль.
См. Блог Scott Gu для получения дополнительной информации.
Не используйте его, даже если это действительно работает, это может прекратить работать в следующем пакете обновления / версия.
момент Вы делаете что-то на основе внутренних деталей реализации а не контракта (в этом случае, MSDN), можно ожидать попадать в беду в будущем.
Почему бы не избегать вопроса полностью и использования Кэширующийся Блок Библиотеки Предприятия ? Вы могли использовать Систему. Сеть. При кэшировании, но Вы, вероятно, не получите поддержку Microsoft, если Вы столкнетесь с проблемами, и Вы повысите брови, таким образом, это не могло бы стоить того.
Если вы ищете общее решение: Это типичная ситуация для подхода внедрения зависимостей. Используя этот подход, вы можете следовать за Скоттом Хансельманом и MSDN!
Вставьте зависимость System.Web, например HttpRuntime.Cache, без ссылки на System.Web в вашей библиотеке.