在 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 的每个幂都有有限长度的十进制表示,所以每个 float 也是如此)。
“我什么时候可以停止打印额外数字”的标准通常选择为“如果您将十进制输出解析为再次漂浮”。简而言之:预计输出一个 float “往返”。
如果您解析十进制表示 34.844479
和 34.84448
,您会发现它们都转换回浮点值 0x420b60bf
或 01000010000010110110000010111111
。所以这两个字符串代表相同的 float 。(来源:自己尝试 https://www.h-schmidt.net/FloatConverter/IEEE754.html)
你的问题归结为“为什么不同的运行时库为同一个 float 打印出不同的值?”,答案是“通常由库决定何时停止打印数字,它们不是要求至少停止”。只要您在再次解析时能得到相同的 float ,库就完成了它的工作。
如果您想查看完全相同的十进制字符串,您可以使用适当的格式设置选项来实现。
关于c# - C# 和 C/C++ 中二进制到 float 转换的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55220510/