C#和C / C ++中二进制到浮点转换之间的区别

时间:2019-03-18 11:39:17

标签: c# c++ c .net

在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;

2 个答案:

答案 0 :(得分:6)

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

通常选择“何时可以停止打印多余的数字”的标准,因为“如果将十进制输出解析为一个精确的值,则可以停止打印多余的数字。再次漂浮”。简而言之:期望输出浮点数“往返”。

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

您的问题归结为“为什么不同的运行时库为同一个浮点数打印出不同的值?”,答案是“通常由库确定何时停止打印数字,而不是必须停在最低限度”。只要您再次解析它时可以返回相同的浮点数,库就可以完成其工作。

如果您希望看到完全相同的小数字符串,则可以使用适当的格式设置来实现。

答案 1 :(得分:1)

由于值是相同的,我们可以猜测正在处理该值的打印功能可能只是其中的细微差别:-)