C# 计算器数学误差

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

我使用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 = 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));