【问题标题】:In C#, why am i getting "can't cast double to float error"?在 C# 中,为什么会出现“无法将双精度转换为浮点错误”?
【发布时间】:2013-03-10 02:40:34
【问题描述】:

我有以下代码行:

    float top = shape.Y + (shape.Height / 2.0) - 4.5;

失败并出现错误'Can't cast double to float。 Shape.Y 和 shape.height 都是 float 类型。

是什么导致了这个错误,最好的办法是确保 top 是一个浮点数(因为我需要将它传递给另一个期望浮点数的函数。

【问题讨论】:

    标签: c# floating-point double


    【解决方案1】:

    尝试用f 包裹您的号码,因为通常2.0 将代表double 号码。你可以阅读更多关于floathere的信息。

    float top = shape.Y + (shape.Height / 2.0f) - 4.5f;
    

    【讨论】:

      【解决方案2】:

      原因是您的文字 2.04.5 属于 double 类型。

      然后在你的表情中

       shape.Y + (shape.Height / 2.0) - 4.5
      

      划分似乎在floatdouble 之间。但是有一个从floatdouble隐式转换(另一个方向的转换不是隐式的),所以Height 被“扩大”到double。然后将Y 添加到这个double,出于同样的原因,Y 也被扩大到double。然后整个表达式的类型为double

      但是您将top 变量声明为float,并且double 表达式无法隐式转换为float

      富士给出了解决方案:如果你把文字写成2.0f(或者只是2f)和4.5f,那么加法、除法和差值将一直计算为floats,没有需要转换。

      (实际上,如果您将分母指定为2,它将隐式地从int 转换为float,但正如您现在所知道的,如果您包含@,可能更容易看出意图987654346@.)

      【讨论】:

      • 不知道对浮点转换规则有什么考虑?似乎隐式双浮点转换在 99.9% 的情况下是正确的,而隐式浮点到双精度转换通常是错误的(例如,比较 float f=(float)(1.0/10.0);double d=1.0f/10.0f; 的精度。或 float.MaxValue.CompareTo((float)(3.0E+38*2.0)) [正确将浮点最大值报告为小于 3.0E38*2] 与 double.MaxValue.CompareTo(3.0E+38f*2.0f) [错误地将双倍最大值报告为小于 3.0E38*2]。
      • @supercat 我明白你的意思。但当然,原因是 one 特定的floatdouble 的转换始终是准确的,并且永远不会丢失信息。 一个特定的doublefloat 的转换通常会丢失精度,并且有时会将有限的double 投影到float.PositiveInfinity(或负数)上。所以这是“之前”算术(你的例子的除法和乘法)。
      • 如果将最准确地表示某个特定数值的double 转换为float,则结果要么是最准确地表示该值的float,要么是比最准确的float 表示更差 LSB 的一小部分。如果将最准确地表示数值的float 分配给double,则结果将很少接近原始值的最佳表示。与随意猜测必要信息相比,丢失不必要的信息远没有那么邪恶。
      • 在我的第一个示例中,我使用了除以十而不是文字,因为有人可能会争辩说 0.1f 实际上是数字量 13421773/134217728 的源代码表示(尽管它看起来像1/10)。我建议这样的浮点值实际上意味着 (13421773 +/- 0.5) /134217728。尽管 IEEE 要求浮点运算的标称结果必须是标称操作数的正确舍入版本,但这并不意味着这些值实际上表示精确的数量。如果他们这样做了,...
      • 所以您正在考虑exactMathematicalNumber → float → doubleexactMathematicalNumber → double → float,其中箭头表示转换“映射”。在这种情况下,我们可以看到第一个“组合”从丢弃太多精度开始,然后添加了很多零位。而第二个构图首先丢掉了一些精度,然后又丢掉了一些。所以你的“逻辑”是有道理的。但是 C# 的设计者只考虑了float → double(添加一些零位)和double → float(丢弃精度)。所以他们由此得出了结论。
      猜你喜欢
      • 1970-01-01
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 2015-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-26
      相关资源
      最近更新 更多