首页 > 解决方案 > C# 和 C/C++ 中二进制到浮点数转换的区别

问题描述

在 C/C++ 和 C# 中转换二进制数时,我们通过四舍五入得到 2 个不同的结果。例如 - 让我们1000010000010110110000010111111以 C# 为例 - 我们会得到34.84448,而我们会得到34.844479,为什么会有这么小的差异?在 C# 中转换:

float f = System.BitConverter.ToSingle(bytearray,0);
//bytearray is an array that contains our binary number

在 C++ 中:

int a = 1108041919; //The number that is being represented
float f = *(float *)&a;

标签: c#c++c.net

解决方案


有很多方法可以用十进制明确表示相同的浮点值。例如,您可以在精确输出之后添加任意多个零(请注意,由于每个 2 的幂都有一个有限长度的十进制表示,所以每个浮点数也是如此)。

“我什么时候可以停止打印额外的数字”的标准通常选择为“如果您再次将十进制输出解析为浮点数,当您得到完全相同的值时,您可以停止打印额外的数字”。简而言之:预计输出浮点数“往返”。

如果您解析十进制表示34.84447934.84448,您会发现它们都转换回浮点值0x420b60bf01000010000010110110000010111111。所以这两个字符串都代表相同的浮点数。(来源:在https://www.h-schmidt.net/FloatConverter/IEEE754.html上亲自尝试)

您的问题归结为“为什么不同的运行时库为同一个浮点数打印出不同的值?”,答案是“通常由库决定何时停止打印数字,它们不需要停止至少”。只要您在再次解析时可以得到相同的浮点数,库就完成了它的工作。

如果您想看到完全相同的十进制字符串,您可以使用适当的格式选项来实现。


推荐阅读