2014-04-30 2 views
0

Это действительно мой первый запрос здесь, но я столкнулся с проблемой, которую я уверен в том, что мне не хватает чего-то простого.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

+0

Является ли значение когда-либо написанным (скажем) строкой и разобранным? –

+0

Нет! К сожалению, это просто передается непосредственно из DLL. –

+0

Почему вы не можете отлаживать DLL и посмотреть, как работает ваш метод при запуске ASP.NET MVC? –

ответ

0

Hi, проблема решена!

Благодаря 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

Смежные вопросы