代码之家  ›  专栏  ›  技术社区  ›  Trax

C#将Double转换为Float会损失这么多精度为什么?

  •  0
  • Trax  · 技术社区  · 7 年前

    当我使用visualstudio调试程序时;

    (float)double_variable
    

    我看到得到的浮点变量是“91.1515”。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Wai Ha Lee captain-yossarian from Ukraine    7 年前

    C语言和许多其他语言都使用 IEEE 754 作为其浮点数据类型的规范。浮点数表示为有效位和指数,类似于科学记数法中十进制数的表示方式

    1.234567890 x 10^12
         ^          ^
      mantissa   exponent
    

    我不想谈细节(维基百科的文章比我能做的更好),但是ieee754 specifies that :

    • float 数据类型,有效位精度为24位,指数精度为8位。

    • 对于64位浮点数,例如C# double

    因为 浮动 只有24个 精确的说,它只能表达7-8 精确的。相反,a 双重的 有53个 精确到15-16 精确的。

    正如评论中所说,如果你不想失去精确性,就不要从 双重的 浮动 (总共32位)。根据您的应用程序,您可以使用 decimal 具有28-29位小数精度的数据类型,但会有惩罚,因为(a)涉及它的计算比 双重的 ,并且(b)外部库通常不支持它。


    注意你说的 91.15149709518846 实际上会被解释为 91.1514970951884 通过编译器-例如,参见, this :

    double value = 91.151497095188446;
    Console.WriteLine(value);
    // prints 91.1514970951884
    
        2
  •  0
  •   Krunx    7 年前

    您可以在这里找到详细的解释: https://stackoverflow.com/a/2386882/10863059

    基本上,与double(8字节)相比,float占用的内存空间更小(4字节),但这只是故事的一部分。