-1
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

任何人都可以帮助解释为什么我会遇到这样的问题?

4

2 回答 2

2

二进制不能1/10准确地用十进制表示,就像基数 10 不能1/3准确表示,而基数 12 可以(三分之一是0.4基数 12)。

通常,如果您想获得更好decimal的数学准确性,您会使用数学来代替,如下所示:

decimal x = 2.5M;
decimal y = 1.19M;

Console.WriteLine(x + y);

decimal有效,因为它以十进制而不是二进制计算。但是,如果您的教授要求您转换为二进制来进行数学运算,那么初始类型是什么并不重要。用二进制永远不可能得到正确的结果。

于 2018-05-23T05:53:47.423 回答
-1

之所以会出现这种情况,是因为1/10二进制无法准确表达。

您可以尝试以下方法:

float a = 3.5f;
float b = 5.39f;

Console.WriteLine(Math.Round(a + b, 2));
Console.ReadLine();

使用Math.Round(value, digits),你可以得到你想要的结果。

于 2018-05-23T04:52:36.513 回答