在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;
答案 0 :(得分:6)
有许多方法可以明确以十进制表示相同的浮点值。例如,您可以在精确输出之后任意添加多个零(请注意,由于2的每个幂均具有有限长度的十进制表示形式,因此每个浮点数也是如此)。
通常选择“何时可以停止打印多余的数字”的标准,因为“如果将十进制输出解析为一个精确的值,则可以停止打印多余的数字。再次漂浮”。简而言之:期望输出浮点数“往返”。
如果解析十进制表示形式34.844479
和34.84448
,您会发现它们都转换回浮点值0x420b60bf
或01000010000010110110000010111111
。因此,这两个字符串都代表相同的浮点数。(来源:在https://www.h-schmidt.net/FloatConverter/IEEE754.html上尝试一下)
您的问题归结为“为什么不同的运行时库为同一个浮点数打印出不同的值?”,答案是“通常由库确定何时停止打印数字,而不是必须停在最低限度”。只要您再次解析它时可以返回相同的浮点数,库就可以完成其工作。
如果您希望看到完全相同的小数字符串,则可以使用适当的格式设置来实现。
答案 1 :(得分:1)
由于值是相同的,我们可以猜测正在处理该值的打印功能可能只是其中的细微差别:-)