float resultInteger = 0.0f; float power = 1/2.0f;for (i = highPointPosition+1; i <= highResultIndex; i++, power /= 2 resultInteger += result[i] * power;power = 1.0f;for (i = highPointPosition, power = 1.0f; i >= 0; i--, power *= 2) resultInteger += result[i] * power;if (carry == 1) resultInteger += carry * power;上面的代码将二进制转换为浮点数。我接到了一项作业,要求我将两个浮点数转换为二进制,然后将它们相加,然后将结果转换为浮点数。在上面的代码中,当我执行3.5 + 5.39结果应该是8.89,而是8.889999。对于其他人来说9.5 + 7.39,答案是正确的,即16.89。任何人都可以帮助解释为什么我遇到这样的问题吗?
2 回答
SMILET
TA贡献1796条经验 获得超4个赞
发生这种情况的原因是1/10无法在二进制系统中准确表达。
您可以尝试以下操作:
float a = 3.5f;
float b = 5.39f;
Console.WriteLine(Math.Round(a + b, 2));
Console.ReadLine();
使用Math.Round(value, digits),就可以得到想要的结果。
慕桂英546537
TA贡献1848条经验 获得超10个赞
二进制不能1/10
用十进制准确表达,就像基数 10 不能1/3
准确表达,而基数 12 可以(三分之一0.4
在基数 12 中)。
通常,如果您想获得更好的数学准确性,您可以使用decimal
来代替进行数学运算,如下所示:
decimal x = 2.5M; decimal y = 1.19M; Console.WriteLine(x + y);
decimal
有效,因为它以十进制计算,而不是二进制。但是,如果您的教授要求您将其转换为二进制以进行数学运算,那么初始类型是什么并不重要。用二进制永远不可能得到正确的结果。
- 2 回答
- 0 关注
- 794 浏览
添加回答
举报
0/150
提交
取消