Это действительно мой первый запрос здесь, но я столкнулся с проблемой, которую я уверен в том, что мне не хватает чего-то простого.C# двойное значение из C# dll потеряет десятичные позиции
Я написал библиотеку классов C# с функцией, которая возвращает List>. Сама функция отлично работает, если она используется в консольном приложении, которое я создал для тестирования DLL. Концовка часть функции:
/* Sorto i risultati in base al ranking */
List<KeyValuePair<string, double>> SortedList = new List<KeyValuePair<string, double>>(matchIndexList_rank);
SortedList.Sort(delegate(KeyValuePair<string, double> firstPair,
KeyValuePair<string, double> secondPair)
{
return (-1) * firstPair.Value.CompareTo(secondPair.Value);
}
);
stopWatch.Stop();
response.success = true;
response.executionTime = stopWatch.ElapsedMilliseconds;
response.resultListKVPStrDoub = SortedList;
return response;
Вот, например, двойная часть первого значения в списке 15,5796761265999
Проблема возрастает, если я включать (извините, не может включать в себя фотографии еще!) DLL в приложении ASP.NET MVC, которое использует эту функцию. В этом случае двойная часть List> возвращается без десятичной части.
Соответствующее значение приведенному выше возвращается как +155796761265999,0
Вот немного кода, где я получаю неправильное возвращаемое значение:
searchEngine.Core.search search = new searchEngine.Core.search(HttpContext.Current.Server.MapPath("~/index_" + oIdentity.comapanyId.ToString()));
searchEngine.Core.genericResponse response = search.doSearch(searchStr);
double maxScore = response.resultListKVPStrDoub.Count > 0 ? response.resultListKVPStrDoub[0].Value : 1;
В примере maxScore получить значение 155796761265999.0, но и любое другое значение в Списке испытывает ту же проблему.
Если я проверяю переменные с обеих сторон, Visual Studio 2013 утверждает, что тип действительно является двойным.
Оба проекта разработаны на той же машине, которая также является моей тестовой средой. Я использую .Net Framework 4.0 для обоих проектов и для всех параметров сборки, по-видимому, одинаково для обоих проектов.
Уверен, что я пропустил что-то простое, но просто не могу получить. Буду признателен за любую помощь.
Благодаря
Lorenzo
Привет, проблема решена! (извините, но я еще не могу ответить по собственному вопросу до 8 часов после публикации)
Благодаря Radu Pascal, который поместил меня на правильный путь: обычно я всегда добавляю библиотеку классов к решению для ее отладки, но в этом случае я разработал его для другого проекта, и он работал нормально, поэтому я проигнорировал obviuos.
Благодаря Марку Гравелю, он заметил проблему: даже если я забыл об этом в базе своей поисковой системы, есть индекс на основе файлов. Там, где я черпаю свои ценности из текста, и там, где я неправильно читаю.
Настоящая загадка заключается в том, что одна и та же DLL, используемая в консольном приложении, используемая для тестирования, и даже на другом ASP.NET MVC на одном компьютере работает отлично. Я решил использовать double.parse вместо Convert.ToDouble и навязать инвариантную культуру.
idfDict[idItem] = double.Parse(s.Split('|')[1], System.Globalization.NumberStyles.AllowDecimalPoint, System.Globalization.NumberFormatInfo.InvariantInfo);
Спасибо всем! Lorenzo
Является ли значение когда-либо написанным (скажем) строкой и разобранным? –
Нет! К сожалению, это просто передается непосредственно из DLL. –
Почему вы не можете отлаживать DLL и посмотреть, как работает ваш метод при запуске ASP.NET MVC? –