【问题标题】:Why use double.Parse and then cast to a float?为什么使用 double.Parse 然后转换为浮点数?
【发布时间】:2012-10-16 23:00:21
【问题描述】:

我在我正在处理的一些代码中看到了这一点:

num1 = (float)double.Parse(parameters[i + 1]);
num2 = (float)double.Parse(parameters[i + 2]);

想知道他们为什么不直接使用float.Parse 而不是double.Parse 并转换为float。有什么好的理由吗?

【问题讨论】:

  • 我认为他们不知道float.ParseSingle.Parse 存在

标签: c# casting refactoring type-conversion


【解决方案1】:

有什么好的理由吗?

是的。如果参数很大,上面的代码将引发OverflowException,但代码只需要最大值为float max的值。

【讨论】:

  • 不过,预期的参数在 0 到 100 之间。所以我想在这种情况下我可以安全地重构它。
  • @JohnSmith 是的,在这种情况下是的。
【解决方案2】:

有什么好的理由吗?

不是真的。这里的主要区别是:

  1. 一点额外的开销(这当然没有任何好处)

  2. 如果值超出单个可表示的范围,则会出现不同的潜在异常。

一般来说,这可能应该直接使用Single.Parse

【讨论】:

  • 据我所知,Single.Parse 通过生成 Double 并将其转换为 Single 来工作,例如Single.Parse("8888888.5000000001").
【解决方案3】:

如果您尝试这段代码,您会发现,例如,如果数字太大而无法使用 float 表示,则会引发异常,但当从 double 转换为 float 时不会出现任何异常。这个数字将是无穷大。自己试试吧:

string numString = "23339823498723948723958734956283468237468273468274602983409283.4092834092834029834029384029834";
            double num2 = double.Parse(numString);
            float num3 = (float)num2;
            float num1 = float.Parse(numString);

也许有人一开始就预料到了这种行为。即使,我会使用 try catch 而不是这种方法。

【讨论】:

    猜你喜欢
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-23
    • 1970-01-01
    相关资源
    最近更新 更多