【问题标题】:Plus or minus minor glitch in my android calculator我的 android 计算器中的正负小故障
【发布时间】:2013-12-08 15:44:35
【问题描述】:

我做了一个安卓计算器,最近我添加了 +/- 按钮。我面临的问题是,首先当我使用它时,按下等号按钮,应用程序崩溃了。此外,只要我单击 +/- 按钮,数字就会变成浮点值,当我输入任何数字时,数字值会在小数点后继续。示例:我有 200,然后按 +/-,数字变为 200.0,当我键入任何数字时,它变为 200.01。我该如何克服这个问题?有人可以让我知道我的代码需要进行哪些更改吗?这里是。 谢谢你。 :)

    public class MainActivity extends Activity {
    Typeface font1, font2;

    TextView tv1;
    private EditText Scr; //textbox screen
    private float NumberBf; //Save screen before pressing button operation;
    private String Operation;
    private ButtonClickListener btnClick;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);  
        setContentView(R.layout.activity_main);
        font1=Typeface.createFromAsset(getAssets(), "digits.ttf");
        Scr=(EditText)findViewById(R.id.editText);
        Scr.setTypeface(font1);
        font2=Typeface.createFromAsset(getAssets(), "alexbrush.TTF");
        tv1=(TextView)findViewById(R.id.textView1);
        tv1.setTypeface(font2);
        Scr = (EditText) findViewById(R.id.editText);
        Scr.setEnabled(false);
        btnClick = new ButtonClickListener();
        int idList[] = {R.id.button0,R.id.button7, R.id.button1, R.id.button8,R.id.button9,R.id.button4,
                R.id.button5,R.id.button6,R.id.button,R.id.button2,R.id.button3,R.id.buttonDot,
                R.id.buttonMul,R.id.buttonDiv,R.id.buttonAdd,R.id.buttonSub,R.id.buttonC,
                R.id.buttonEq, R.id.buttonSqrt, R.id.buttonsquare, R.id.buttonNp
        };

        for(int id:idList){
            View v = (View) findViewById(id);
            v.setOnClickListener(btnClick);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    public void mMath(String str){
        NumberBf = Float.parseFloat(Scr.getText().toString()); //save the screen
        Operation = str; //save operation
        Scr.setText("0"); //Clear screen
    }

    public void getKeyboard(String str){
        String ScrCurrent = Scr.getText().toString();
        if(ScrCurrent.equals("0"))
            ScrCurrent = "";
        ScrCurrent += str;
        Scr.setText(ScrCurrent);
    }

    public void mResult(){
        float NumAf = Float.parseFloat(Scr.getText().toString());
        float result = 0;
        if(Operation.equals("+")){
            result = NumAf + NumberBf;
        }
        if(Operation.equals("-")){
            result = NumberBf - NumAf;
        }
        if(Operation.equals("*")){
            result = NumAf * NumberBf;
        }
        if(Operation.equals("/")){
            result = NumberBf / NumAf;
        }
        Scr.setText(String.format("%10d", result));
    }

    public void fnSqrt(){
        double Number = Double.parseDouble(Scr.getText().toString());
        Number = Math.sqrt(Number);
        Scr.setText(String.valueOf(Number));
    }

    public void fnSquare(){
        float Number1 = Float.parseFloat(Scr.getText().toString());
        Number1 = pow(Number1, 2);
        Scr.setText(String.valueOf(Number1));
    }

    public void fnNp(){
        float Number = Float.parseFloat(Scr.getText().toString());
        Number = Number*(-1);
        Scr.setText(String.valueOf(Number));
        }

    private float pow(float number1, int i) {
        return number1*number1;
    }

    private class ButtonClickListener implements OnClickListener{
        public void onClick(View v){
            switch (v.getId()){
                case R.id.buttonC: //Clear screen
                    Scr.setText("0");
                    NumberBf = 0;
                    Operation = "";
                    break;
                case R.id.buttonAdd: //function Add
                    mMath("+");
                    break;
                case R.id.buttonSub:
                    mMath("-");
                    break;
                case R.id.buttonMul:
                    mMath("*");
                    break;
                case R.id.buttonDiv:
                    mMath("/");
                    break;
                case R.id.buttonEq:
                    mResult();
                    break;
                case R.id.buttonSqrt:
                    fnSqrt();
                    break;
                case R.id.buttonNp:
                    fnNp();
                    break;    
                case R.id.buttonsquare:
                    fnSquare();
                    break;
                default:
                    String numb = ((Button) v).getText().toString();
                    getKeyboard(numb);
                    break;
            }
        }
    }
}

【问题讨论】:

  • 旁注:Java 中的变量应该是camelCase。对于有经验的 Java 程序员来说,看到 TitleCase 的变量会很困惑——我们假设这些是类。
  • 不清楚您要做什么。由于您将“+/-”按钮作为单个按钮提到,我认为您正在尝试使用此按钮来更改您输入的任何符号的符号,但我没有看到此代码中的任何地方都处理了这种情况。这是你想要做的吗?
  • public void fnNp 这是用于它的函数。

标签: java android eclipse calculator


【解决方案1】:

关于你的第一个问题:你得到一个空指针异常吗?

public void mResult(){
    float NumAf = Float.parseFloat(Scr.getText().toString());

不会阻止您的语句尝试将空字符串转换为浮点数,这显然会让您的应用程序崩溃。所以在之前包含一个捕获空值的机制。

case R.id.buttonEq:
    if (Scr.getText() != null)
        mResult();
    break;

我认为这是防止mResult() 获得空值的最简单方法。

对于你的第二个问题:它变成了一个浮动,因为你这样做了

float Number = Float.parseFloat(Scr.getText().toString());`

当您将 200 转换为浮点数时,它变为 200.00,它将作为字符串返回。

编辑:我意识到你也有一个 dotButton(你的代码真的很乱)。建议的替代方案当然不适用于十进制数字,因为它总是转换您的numbervalue。为了防止这种行为,也许你可以实现一个简单的 if/else 语句。

public void fnNp() {
    if (Scr.getText().toString().contains(".")) {
        float Number = Float.parseFloat(Scr.getText().toString());
        Number = Number*(-1);
        Scr.setText(String.valueOf(Number));
    } else {
        int number = Integer.parseInt(Scr.getText().toString());
        Number = Number*(-1);
        Scr.setText(String.valueOf(Number));
    }
}

【讨论】:

    【解决方案2】:

    您需要在 mResult 中执行 if 语句,检查 float 是否与 float 的 int 的 float 有绝对差异,小于,比如 Float.MIN_VALUE ,然后获取 float 的 int 的 toString如果是的话。

    在函数 setScreenTextWithNumber(Number n) 中包装调用 Scr.setText(Float f) 并在那里进行检查。

    如果您只检查小数点,那么 2.0000 / 2 = 1.000 如果这是您想要的。 否则,检查显着差异会调用与最接近的整数没有显着差异的数字是整数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-31
      • 2016-09-20
      • 2019-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多