【问题标题】:C# Wrong conversion using Convert.ChangeType()C# 使用 Convert.ChangeType() 的错误转换
【发布时间】:2009-08-17 13:19:16
【问题描述】:

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

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

这在大多数情况下都很好用,但是我发现如果我尝试转换一些简单的东西,比如返回以下 sql 查询

select 3.2

上述代码(T 为双精度)不会返回 3.2,而是 3.2000000000000002。我无法理解为什么会发生这种情况,或者如何解决它。请帮忙!

【问题讨论】:

    标签: c# generics casting


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        这不是转换的问题。内部 double 类型表示为实数 2 的无限小数,这就是你得到这样结果的原因。取决于您的用途:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-12-21
          • 1970-01-01
          • 2021-01-11
          • 1970-01-01
          • 1970-01-01
          • 2011-12-27
          • 1970-01-01
          相关资源
          最近更新 更多