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
。
任何人都可以帮助解释我遇到这种问题的原因吗?
答案 0 :(得分:2)
二进制不能准确地表达十进制小数1/10
,就像基数10不能准确表达1/3
一样,而基数12可以(基数12中的1/3是0.4
)。
通常情况下,如果你想获得更好的数学准确性,你可以使用decimal
代替数学运算,如下所示:
decimal x = 2.5M;
decimal y = 1.19M;
Console.WriteLine(x + y);
decimal
有效,因为它以十进制计算,而非二进制计算。但是,如果你的教授要求你转换成二进制来进行数学运算,那么初始类型是什么并不重要。永远不可能用二进制获得正确的结果。
答案 1 :(得分:-1)
这是因为1/10
无法在二进制系统中准确表达。
您可以尝试以下操作:
float a = 3.5f;
float b = 5.39f;
Console.WriteLine(Math.Round(a + b, 2));
Console.ReadLine();
使用Math.Round(value, digits)
,您可以获得所需的结果。