C#使用Convert.ChangeType()进行错误的转换

时间:2009-08-17 13:19:17

标签: c# generics casting

我使用Convert.ChangeType()将Object(我从DataBase获得)转换为泛型类型T.代码如下所示:

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

并且这在大多数情况下都很有用,但是我发现如果我尝试将某些内容简单地转换为返回以下sql查询

select 3.2

上面的代码(T为double)不会返回3.2,而是3.2000000000000002。我不明白为什么会这样,或者如何解决它。请帮忙!

3 个答案:

答案 0 :(得分:7)

您所看到的是浮点数在内存中表示的方式。关于为什么会这样,有很多可用的信息,但this paper是一个很好的信息。这种现象就是为什么你最终会出现看似异常的行为。永远不应该向未格式化的用户显示doublesingle,并且应该避免像瘟疫这样的平等比较。

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

答案 1 :(得分:4)

这可能是因为floating point arithmetic。您可能应该使用十进制而不是双精度。

答案 2 :(得分:2)

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

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