【问题标题】:Casting Math.Pow to float将 Math.Pow 转换为浮动
【发布时间】:2014-07-17 14:39:59
【问题描述】:

我正在尝试将 Math.Pow 转换为 float 类型,但 VS2013 告诉我“无法将类型 'double' 隐式转换为 'float'。

我以为我在做演员如下:

private void COMBO_AWG_SelectedIndexChanged(object sender, EventArgs e)
{
    float d = 0.0f;
    int awg = int.Parse(COMBO_AWG.Text);
    //MessageBox.Show(awg.ToString());
    d = 0.127 * (92 * ((float)Math.Pow(36, awg) / 39));

    TB_awg2mm.Text = d.ToString();
}

有什么想法吗?

【问题讨论】:

标签: c# casting type-conversion pow


【解决方案1】:

正在将其转换为float,但您将该结果与double 相乘,得到double

任何不是整数且没有以fF 为后缀的文字都被视为double

解决这个问题:

d = 0.127F * (92 * ((float)Math.Pow(36, awg) / 39));

注意0.127 后面的F

【讨论】:

    【解决方案2】:

    您对float 的转换一直有效,直到您与0.127 相乘,这是一个double 值。所有int 值都将隐式转换为float 以进行计算。与 double 值的最终乘法使整个表达式成为 double 类型。

    CPU 在内部使用double 进行所有浮点运算,因此如果您仍然需要进行强制转换,则在计算的早期步骤中使用float 是没有意义的。一直使用double 值(以获得最佳精度),并转换最终结果:

    d = (float)(0.127 * (92.0 * (Math.Pow(36.0, awg) / 39.0)));
    

    【讨论】:

      【解决方案3】:

      您的问题是数字0.127,编译器将解释为双精度,因此整个表达式的结果将导致双精度值。

      像这样修复它:

        d = 0.127f * (92.0f * ((float)Math.Pow(36.0f, awg) / 39.0f));
      

      f 附加到一个数字会使编译器将其解释为float

      编辑: 对于Math.Pow 不存在float 的重载,因此您必须转换结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-21
        • 2015-06-01
        • 2018-01-29
        • 2012-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多