Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中,为什么我会得到;can';t将双精度转换为浮点错误“;?_C#_Floating Point_Double - Fatal编程技术网

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
。然后整个表达式得到type
double

但是您将
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
。然后整个表达式得到type
double

但是您将
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
其中箭头表示转换“映射”。在这种情况下,我们可以看到第一个“合成”开始时丢弃了太多的精度,然后向该精度添加了很多零位。而第二个合成首先丢弃了一些精度,