2009-08-17 108 views
2

我使用Convert.ChangeType()从对象转换(这是我从数据库中获取),以一个泛型类型T的代码如下所示:C#错误转换

T element = (T)Convert.ChangeType(obj, typeof(T)); 
return element; 

这个伟大工程的大部分时间,但是我发现,如果我试图投简单的东西如下面的SQL查询

select 3.2 

上面的代码(T为双)的回报率不会回到3.2,但3.2000000000000002 。我不明白为什么会发生这种情况,或者如何解决这个问题。请帮忙!

回答

7

你看到的是浮点数在内存中表现的方式。有相当多的信息可以确切地说明这是为什么,但this paper是一个很好的信息。这种现象就是为什么你最终会出现看起来异常的行为。永远不应该将未被格式化的用户显示为doublesingle,并且应该避免像鼠疫这样的平等比较。

如果您需要精确到更高精度水平的数字(即表示货币值),请使用decimal

2

这不是转换问题。内部双重类型表示实数的2的无限分数,这就是为什么你会得到这样的结果。根据你的目的使用:

  • 用十进制
  • 或者使用精确的格式化{0:F2}
  • 使用Math.Flor/Math.Ceil