在浮点数中为什么要使用 Long?

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

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

Console.WriteLine("Long  : " + sizeof(long)); // Output --> Long : 8
Console.WriteLine("Float : " + sizeof(float));// Output --> Float: 4
4个回答

10

一个浮点数的范围(约为±3.4e38)比一个长整型的范围(约为±9.22e18)大得多,尽管长整型具有更高的精度。


浮点数的精度是指小数点后的位数,而数字的长度则指整个数字中包含的数字位数。 - Mohammad Jahangeer Ansari
一个浮点数具有23位精度。http://zh.wikipedia.org/wiki/单精度浮点数格式 - Ignacio Vazquez-Abrams
正如您的sizeof()调用所显示的,long为8字节,而float为4字节。由于4比8小,因此可以将float值分配给long。但是您不能将long分配到float中,因为8比4大。 - IanNorton
@IanNorton:不,那不是这样的。而且,你读错了;它允许从long赋值给float,但不允许从float赋值给long。 - Ignacio Vazquez-Abrams
1
float基于科学计数法,将一些位数用于指数,而long仅在二进制中存储数字。正是因为这个原因,float可以存储更大的数字,但随着指数远离0,它会失去越来越多的精度。 - TheBoxyBear
显示剩余2条评论

6

有2个原因:

1. 值的范围(例如最大值)。

+--------------+-----------------------------+
|  data type   |        Maximum Value        |
+--------------+-----------------------------+
|              |                             |
|   long       |     9223372036854775807     |
|              |                             |
|   float      |     3.402823E+38            |
|              |                             |
+--------------+-----------------------------+

由于float的最大值比long大,因此该类型包含在float中。
So, float= long  is possible
but, long = float is not possible

2. 优越性
如果没有显式转换,你不能直接将浮点值赋给整型(非浮点)值。

float a=90     //correct
float b=90.0f; //correct

但是
long a=90     //correct
long b=90.0f; //wrong

从上面的例子中可以看出,float类型可以包含long类型的数据,但反过来不行。

编辑: 关于数据类型大小,请参考我的问题“值的范围是否取决于数据类型的大小?”


1

long 表示 Int64 类型,即整数类型,而 float 表示 Single 类型,即浮点数类型。尽管 long 的大小比 float 大,但是从浮点数转换为整数会丢失信息。

有关 long 和 float 类型的更多信息,请参阅 msdn。


除了一些数字,整数转换为浮点数也无法避免丢失信息。 - ssube

0
人们提到了浮点数和长整型的范围,但更简单的一点是,你不能用整数表示大多数可能的浮点数。如果你的浮点数是3.14159,最接近的两个长整型可以表示的值分别是3或4——都是完全错误的。一个浮点数可以表示介于3和4之间的数十亿个值。如果程序员想要表示类似于整数的值,使用浮点数将是一个非常糟糕的设计决策。因此,隐式转换浮点数->整数太危险了,因为你几乎肯定会丢失重要的数据。这不是我们经常故意做的事情,当我们这样做时,通常喜欢明确地表达出来(Math.Floor(floatValue))。

在相反的方向上(int -> float),float通常可以“充分”表示整数值。浮点数的注意事项是数字只能存储为近似值-值越大,表示的准确性就越低。但是,float的精度约为6个有效数字-有损失,但您只会失去原始值的百万分之一。在许多情况下,这将是微不足道的。(在它是重要的情况下,程序员将始终非常小心地引入浮点数的不确定性到他们的计算中,因此在实践中很少会出现问题)。因此,在这个方向上允许隐式转换更方便/有用,因为这是我们故意经常做的事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接