C# 在C中,为什么我会得到;can';t将双精度转换为浮点错误“;?
我有以下代码行:C# 在C中,为什么我会得到;can';t将双精度转换为浮点错误“;?,c#,floating-point,double,C#,Floating Point,Double,我有以下代码行: float top = shape.Y + (shape.Height / 2.0) - 4.5; whic失败,错误为“无法将双精度转换为浮点”。Shape.Y和Shape.height都是float类型 导致此错误的原因以及最好的方法是确保top是一个float(因为我需要将它传递到另一个需要float的函数中。尝试用f来包装数字,因为通常2.0会表示一个双倍的数字。您可以阅读有关float的更多信息 尝试用f来包装数字,因为通常2.0会代表一个double数字。
float top = shape.Y + (shape.Height / 2.0) - 4.5;
whic失败,错误为“无法将双精度转换为浮点”。Shape.Y和Shape.height都是float类型
导致此错误的原因以及最好的方法是确保top是一个float(因为我需要将它传递到另一个需要float的函数中。尝试用
f
来包装数字,因为通常2.0
会表示一个双倍的
数字。您可以阅读有关float
的更多信息
尝试用
f
来包装数字,因为通常2.0
会代表一个double
数字。您可以阅读有关float
的更多信息
原因是您的文本
2.0
和4.5
属于double
类型
然后在你的表情中
shape.Y + (shape.Height / 2.0) - 4.5
分割似乎介于float
和double
之间。但是有一个从float
到double
的隐式转换(另一个方向的转换不是隐式的),因此高度
被“加宽”然后,为了将Y
添加到此双精度中,出于同样的原因,Y
也被扩展为double
。然后整个表达式得到typedouble
但是您将top
变量声明为float
,并且double
表达式不能隐式转换为float
富士给出了解决方案:如果您将文字写成2.0f
(或者干脆写成2f
)和4.5f
,那么加法、除法和差分将一直计算为float
s,并且不需要转换
(实际上,如果您只将分母指定为
2
,它将从int
隐式转换为float
,但您现在可以看出,如果将该f
包含在内,可能更容易看出其意图)原因是您的文本2.0
和4.5
属于double
类型
然后在你的表情中
shape.Y + (shape.Height / 2.0) - 4.5
分割似乎介于float
和double
之间。但是有一个从float
到double
的隐式转换(另一个方向的转换不是隐式的),因此高度
被“加宽”然后,为了将Y
添加到此双精度中,出于同样的原因,Y
也被扩展为double
。然后整个表达式得到typedouble
但是您将top
变量声明为float
,并且double
表达式不能隐式转换为float
富士给出了解决方案:如果您将文字写成2.0f
(或者干脆写成2f
)和4.5f
,那么加法、除法和差分将一直计算为float
s,并且不需要转换
(实际上,如果您只将分母指定为
2
,它将从int
隐式转换为float
,但您现在可以看出,如果将该f
包含在内,可能更容易看出其意图)我想知道浮点转换规则是如何考虑的?似乎隐式双精度浮点转换在99.9%的情况下都是正确的,而隐式浮点转换通常是错误的(例如,比较float f=(float)(1.0/10.0)的精度);
至双d=1.0f/10.0f;
或浮点.MaxValue.CompareTo((浮点)(3.0E+38*2.0))
与双.MaxValue.CompareTo(3.0E+38f*2.0f)相比,正确报告浮点最大值小于3.0E38*2]@supercat我理解你的意思。但当然,原因是一个特定的float
到double
的转换总是精确的,而且从不丢失信息。在另一个方向上,一个特定的double
到float
的转换通常会失去精度,有时会产生有限的错误double
到float上。正整数
(或负整数)。因此这是“在”算术(示例的除法和乘法)之前的结果。如果取最准确表示某个特定数值的双精度
,并将其转换为浮点
,则结果要么是最准确表示该值的浮点
,要么是LSB中比最准确的浮点
表示差的一小部分。如果如果使用最准确地表示数值的float
,并将其赋值为double
,则结果几乎不会接近原始值的最佳表示。丢失不必要的信息远比随意猜测必要的信息要少。在我的第一个示例中,我使用了十除法而不是文字,因为有人可能会争辩说,0.1f
实际上是数字13421773/134217728的源代码表示(尽管它看起来像1/10)。我认为这样的浮点值实际上意味着(13421773+/-0.5)/134217728.尽管IEEE要求浮点运算的标称结果必须是标称操作数的正确四舍五入版本,但这并不意味着这些值实际上代表精确的量。如果它们代表精确的量,…那么您考虑的是exactMathematicalNumber→ 浮动→ 双精度
和精确数学数→ 双重的→ float
其中箭头表示转换“映射”。在这种情况下,我们可以看到第一个“合成”开始时丢弃了太多的精度,然后向该精度添加了很多零位。而第二个合成首先丢弃了一些精度,