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

时间:2019-01-06 20:12:56

标签: c# floating-point

当我使用Visual Studio调试程序时;

当我通过使用将双变量“ 91.151497095188446”转换为浮点数时

(float)double_variable

我看到生成的float变量是“ 91.1515”。

为什么我失去那么多精度?我需要使用其他数据类型吗?

2 个答案:

答案 0 :(得分:1)

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

transform-runtime

我不会详细介绍(Wikipedia文章会尽我所能),但是我会介绍IEEE 754 specifies that

  • 对于32位浮点数(例如C#float数据类型),有效位数的精度为24位,指数的精度为8位。

  • 对于64位浮点数(例如C#double数据类型),其有效位数的精度为53位,指数的精度为11位。

因为1.234567890 x 10^12 ^ ^ mantissa exponent 仅具有24个的精度,所以它只能表示7-8个的精度。相反,float的精度为53个,因此精度为15-16个

如评论中所述,如果您不想失去精度,请不要从double(总共64位)变为double(总共32位) )。根据您的应用程序,您可能会使用decimal数据类型,该数据类型的精度为28-29位十进制数字-但会受到处罚,因为(a)涉及此计算的速度比float或{ {1}}和(b)通常不如外部库所支持。


请注意,您所谈论的是double,实际上编译器会将其解释为float-例如,请参见this

91.15149709518846

答案 1 :(得分:0)

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

基本上,与双精度字节(8个字节)相比,浮点格式占用的内存空间较小(4个字节),但这只是故事的一部分。