关于c#程序中二进制到浮点的转换 float resultingeger=0.0f; 浮动功率=1/2.0f; 对于(i=高点位置+1;i=0;i--,功率*=2) resultInteger+=结果[i]*功率; 如果(进位==1) resultInteger+=进位*功率;

关于c#程序中二进制到浮点的转换 float resultingeger=0.0f; 浮动功率=1/2.0f; 对于(i=高点位置+1;i=0;i--,功率*=2) resultInteger+=结果[i]*功率; 如果(进位==1) resultInteger+=进位*功率;,c#,C#,上面的代码将二进制数转换为浮点数。 我接到一个任务,要求我将两个浮点数转换成二进制,然后将它们相加,然后将结果转换成浮点 在上面的代码中,当我执行3.5+5.39时,结果应该是8.89,而不是8.889999 对于像9.5+7.39这样的其他人,答案是正确的,即16.89 有人能解释一下我为什么会遇到这样的问题吗?发生这种情况的原因是1/10不能用二进制准确地表示 您可以尝试以下操作: float resultInteger = 0.0f; float power = 1/2.0f; for

上面的代码将二进制数转换为浮点数。 我接到一个任务,要求我将两个浮点数转换成二进制,然后将它们相加,然后将结果转换成浮点

在上面的代码中,当我执行
3.5+5.39
时,结果应该是
8.89
,而不是
8.889999

对于像
9.5+7.39这样的其他人,答案是正确的,即
16.89


有人能解释一下我为什么会遇到这样的问题吗?

发生这种情况的原因是
1/10
不能用二进制准确地表示

您可以尝试以下操作:

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;

使用
Math.Round(值、数字)
,您可以得到想要的结果

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

通常,如果您想获得更好的数学精度,可以使用
decimal
进行数学运算,如下所示:

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

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

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

尝试使用
double
decimal
数据类型并查看差异。如果你想在算术运算中获得精确的精度,请使用
decimal
。我尝试了decimal和double,无论怎样,我都得到了相同的结果。使用
Math进行缩放。小数点后两位的四舍五入应该会有所帮助。你不需要计算其余的浮点数。那么结果是0和1的数组吗?你能发布你的完整代码吗?这样我们就可以处理了。显然,问题在于IEEE浮点值的精度。然而,如果我们不能重现问题,我们就无法可靠地测试和回答。我不理解你的意思。我被指派将浮点数转换成二进制,然后将它们相加,最后将结果转换成浮点数。好的,谢谢。我从来没有实际使用过十进制,所以我不知道它会出错。
decimal x = 2.5M;
decimal y = 1.19M;

Console.WriteLine(x + y);