【问题标题】: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。
任何不是整数且没有以f 或F 为后缀的文字都被视为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 的重载,因此您必须转换结果。