【问题标题】:Long in Float, why?长期浮动,为什么?
【发布时间】:2010-12-04 06:08:08
【问题描述】:
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

【问题讨论】:

    标签: c# types floating-point


    【解决方案1】:

    float 的范围(约 ±3.4e38)比 long 的范围(约 ±9.22e18)大很多,尽管 long 具有更高的精度。

    【讨论】:

    • 浮点数和精度的确切长度是多少。
    • 正如您的 sizeof() 调用所示,long 是 8 个字节,而 float 是 4 个字节。您可以将 float 值分配给 long,因为 4 小于 8。您不能将 long 分配给 float,因为 8 大于 4。
    • @IanNorton:不,不是这样。另外,您读错了;它允许从 long 分配到 float,但不允许从 float 到 long。
    • float 是基于科学记数法的,将一些位专用于指数,而 long 只是存储以 2 为底的数字。正因为如此,float 可以存储更大的数字,但会丢失越来越多指数离 0 越远,精度越高。
    【解决方案2】:

    有两个原因

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

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

    作为,float 的最大值为 大于 long 即 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 的数据,反之亦然。

    编辑: 关于数据类型的大小,请参阅我的问题Is Range of value depends upon Size of datatype?

    【讨论】:

      【解决方案3】:

      long 表示 Int64 类型,即整数,而 float 表示 Single 类型,即浮点数。并且即使 long 的大小比 float 大,也无法在不丢失信息的情况下从 float 转换为 integer。

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

      【讨论】:

      • 除少数数字外,也无法在不丢失信息的情况下将整数转换为浮点数。
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-21
        • 2016-01-11
        • 1970-01-01
        • 1970-01-01
        • 2011-12-01
        • 1970-01-01
        • 2013-07-15
        相关资源
        最近更新 更多