来自c#dll的C#double值会丢失小数位

时间:2014-04-30 14:27:22

标签: c# asp.net-mvc dll double

这是我第一次问这里,但是我遇到了一个问题,我确信我错过了一些简单的事情。

我写了一个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应用程序中,问题就会出现。在这种情况下,列表的双重部分&gt;返回没有小数部分。

上面显示的相应值将返回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值,但List中的每个其他值都会遇到同样的问题。

如果我从双方检查变量,Visual Studio 2013会声明该类型确实是双重的。

这两个项目都是在同一台机器上开发的,这也是我的测试环境。我在两个项目上使用.Net Framework 4.0,并且两个项目的所有构建参数似乎相同。

我确信我错过了一些简单的东西,但却无法得到。 我很感激任何帮助。

由于

洛伦佐

嗨,问题解决了!(很遗憾,但是在发布8小时之前我无法通过自己的问题回答)

感谢Radu Pascal让我走上了正确的道路:通常我总是在一个解决方案中添加一个类库来调试它,但在这种情况下,我为另一个项目开发了它并且工作正常,所以我忽略了obviuos

感谢Marc Gravell,他发现了这个问题:即使我在搜索引擎的基础上忘记了它,也有一个基于文件的索引。在那里我从文本中挖掘我的价值观,并且我在那里读错了。

真正的谜团是用于测试的控制台应用程序中使用的相同DLL,甚至在同一台机器上的另一个ASP.NET MVC上工作正常。我解决了使用double.parse而不是Convert.ToDouble并强加了一种不变的文化。

idfDict[idItem] = double.Parse(s.Split('|')[1], System.Globalization.NumberStyles.AllowDecimalPoint, System.Globalization.NumberFormatInfo.InvariantInfo);

感谢大家! 洛伦佐

1 个答案:

答案 0 :(得分:0)

嗨,问题解决了!

感谢Radu Pascal让我走上了正确的道路:通常我总是在一个解决方案中添加一个类库来调试它,但在这种情况下,我为另一个项目开发了它并且工作正常,所以我忽略了obviuos

感谢Marc Gravell,他发现了这个问题:即使我在搜索引擎的基础上忘记了它,也有一个基于文件的索引。在那里我从文本中挖掘我的价值观,并且我在那里读错了。

真正的谜团是用于测试的控制台应用程序中使用的相同DLL,甚至在同一台机器上的另一个ASP.NET MVC上工作正常。我解决了使用double.parse而不是Convert.ToDouble并强加了一种不变的文化。

idfDict[idItem] = double.Parse(s.Split('|')[1], System.Globalization.NumberStyles.AllowDecimalPoint, System.Globalization.NumberFormatInfo.InvariantInfo);

感谢大家! 洛伦佐