C# 为什么长期漂浮?

C# 为什么长期漂浮?,c#,types,floating-point,C#,Types,Floating Point,为什么数据类型的大小和隐式转换没有问题? 正如我们所知,float和long的大小不同,如下所示 long b = 99; float c = 99.0F; //b = c; //Error : Cannot implicitly convert type 'float' to 'long'. c = b; // Running Successfully. Why? 浮点的范围(约±3.4e38)远大于长的范围(约±9.22e18),即使长的精度更高。long表示Int64类型,即整

为什么数据类型的大小和隐式转换没有问题?
正如我们所知,
float
long
的大小不同,如下所示

long b = 99;  
float c = 99.0F;  
//b = c; //Error : Cannot implicitly convert type 'float' to 'long'.
c = b; // Running Successfully.  Why?

浮点的范围(约±3.4e38)远大于长的范围(约±9.22e18),即使长的精度更高。

long表示Int64类型,即整数,而float表示单类型,即浮点数。即使long的大小大于float,也不可能在不丢失信息的情况下从float转换为整数

有关长型和浮动型的更多信息,请参阅msdn

有两个原因

1。值的范围(即最大值)。

Console.WriteLine("Long  : " + sizeof(long)); // Output --> Long : 8
Console.WriteLine("Float : " + sizeof(float));// Output --> Float: 4
同理,浮动的最大值为 大于long即long包含在浮动中

2。优势
在没有显式转换的情况下,不能将浮点值直接赋给整数(非浮点)值

So, float= long  is possible
but, long = float is not possible
但是

在这里,同样从上面的例子来看,float似乎可以包含long的数据,但反之亦然是不可能的

编辑: 关于数据类型的大小,请参见我的问题

人们提到了浮点和长的范围,但更简单的一点是,不能用整数表示大多数可能的浮点数。如果您的浮点值是3.14159,则long可以表示的两个最接近的值是3或4-这两个值都是完全错误的。浮点数可以表示介于3和4之间的数十亿个值。如果程序员想要表示类似整数的值,那么他们在一开始就不太可能使用浮点值,这将是一个非常糟糕的设计决策。所以隐式转换float->int太危险了,因为几乎肯定会丢失的数据几乎肯定很重要。这不是我们经常故意做的事情,当我们做的时候,我们通常喜欢把它显式化(Math.Floor(floatValue))


相反的方向(int->float),一个float通常可以“充分”表示一个整数值。浮点的警告是,数字只能作为近似值存储-值越大,表示的准确性越低。然而,浮点的精度大约为6位有效数字-有损,但只会损失原始值的百万分之一左右。在许多情况下,这将是无关紧要的。(在重要的情况下,程序员总是非常小心地在计算中引入异常的浮点,因此在实践中很少引起问题)。因此,允许在这个方向上进行隐式转换更方便/有用,因为这是我们故意做的很多事情。

数字的确切长度和浮点的精度是多少。浮点有23位精度。正如sizeof()调用所示,long是8字节,float是4字节。因为4小于8,所以可以将浮点值赋给long。你不能给浮点数指定一个long,因为8比4大。@IanNorton:不,不是这个。而且,你读错了;它允许从long到float赋值,但不能从float到long。如果我们可以将long赋值到float上,因为8大于4,那么亲爱的,请尝试将long赋值到int,因为它们是相同的,,但这不起作用为什么,,,除了一些数字,在不丢失信息的情况下,从整数转换为浮点也是不可能的。
So, float= long  is possible
but, long = float is not possible
float a=90     //correct
float b=90.0f; //correct
long a=90     //correct
long b=90.0f; //wrong