C# 计算器数学误差
我使用Unity引擎。 我有一个数学错误 输入:“3+2”,输出:5 但是 输入:“30+20”,输出:2 这个代码怎么了 代码C# 计算器数学误差,c#,math,unity3d,stack,calculator,C#,Math,Unity3d,Stack,Calculator,我使用Unity引擎。 我有一个数学错误 输入:“3+2”,输出:5 但是 输入:“30+20”,输出:2 这个代码怎么了 代码 using System.Collections.Generic; public class Calculator { public float Evaluate(string Input) { string Expression = "(" + Input + ")"; Stack<string> ops
using System.Collections.Generic;
public class Calculator
{
public float Evaluate(string Input)
{
string Expression = "(" + Input + ")";
Stack<string> ops = new Stack<string>();
Stack<float> vals = new Stack<float>();
for (int i = 0; i < Expression.Length; i++)
{
string s = Expression.Substring(i, 1);
if (s.Equals("(")) { }
else if (s.Equals("+")) ops.Push(s);
else if (s.Equals("-")) ops.Push(s);
else if (s.Equals("*")) ops.Push(s);
else if (s.Equals("/")) ops.Push(s);
else if (s.Equals(")"))
{
int count = ops.Count;
while (count > 0)
{
string op = ops.Pop();
float v = vals.Pop();
if (op.Equals("+")) v = vals.Pop() + v;
else if (op.Equals("-")) v = vals.Pop() - v;
else if (op.Equals("*")) v = vals.Pop() * v;
else if (op.Equals("/")) v = vals.Pop() / v;
vals.Push(v);
count--;
}
}
else vals.Push(float.Parse(s));
}
return vals.Pop();
}
}
使用System.Collections.Generic;
公共类计算器
{
公共浮点计算(字符串输入)
{
字符串表达式=“(“+Input+”);
堆栈操作=新堆栈();
堆栈VAL=新堆栈();
for(int i=0;i0)
{
字符串op=ops.Pop();
float v=vals.Pop();
如果(op.Equals(“+”)v=vals.Pop()+v;
如果(op.Equals(“-”)v=vals.Pop()-v;
如果(op.Equals(“*”)v=vals.Pop()*v;
如果(op.Equals(“/”)v=vals.Pop()/v;
推力阀(v);
计数--;
}
}
else vals.Push(float.Parse);
}
返回vals.Pop();
}
}
此行一次只考虑单个数字
运行您的代码:
输入=(30+20)
i=0(
VAL堆栈:
操作堆栈: i=1
3
VAL堆栈:3
操作堆栈: i=2
0
VAL堆栈:0,3
操作堆栈: i=3
+
VAL堆栈:0,3
操作堆栈:+ i=4
2
VAL堆栈:2,0,3
操作堆栈:+ i=5
0
VAL堆栈:0,2,0,3
操作堆栈:+ i=6
)
VAL堆栈:0,2,0,3
操作堆栈:+
完成后,弹出0和2并添加它们以获得最终答案:2您调试过吗?乍一看,它没有考虑两位数的值。它计算
2+0
<代码>3和0只留在堆栈上,从未检查过
else vals.Push(float.Parse(s));