当我使用超过8的数字时,我的计算器会混乱

时间:2013-11-18 17:35:11

标签: java android

我编写了一个计算器,在youtube上看到了一个教程,当我使用4-5位数时,代码完全正常。但是当我使用大约8位数时,结果就会混乱。例如200000000-200 = 1.99998E7有人可以更正我的代码吗?

    package com.example.asd;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.Typeface;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.view.Window;
import android.view.View.OnClickListener;



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
        };

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


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        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.valueOf(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));
    }

    //new class ButtonClickListener


    private float pow(float number1, int i) {
        // TODO Auto-generated method stub
        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.buttonsquare:
                    fnSquare();
                    break;
                default:
                    String numb = ((Button) v).getText().toString();
                    getKeyboard(numb);
                    break;
            }
        }
    }

}

2 个答案:

答案 0 :(得分:4)

你关注的是不精确吗?还是科学记数法?

String.valueOfDouble.toString的结果相同,后者在其规范中有此声明:

  

如果m小于10 ^ -3或大于或等于10 ^ 7,则表示为所谓的“计算机化科学记数法”。令n为唯一的整数,使得10 ^n≤m<1。 10 ^(N + 1);然后将a设为m和10 ^ n的数学上精确的商,使1≤a<1。 10.然后将幅度表示为a的整数部分,作为单个十进制数字,后跟“。”。 ('\ u002E'),后跟表示a的小数部分的十进制数字,后跟字母'E'('\ u0045'),后跟n表示十进制整数,由Integer方法生成。的toString(INT)。

考虑使用String.format("%.20d", value)或类似的东西来获得对双重字符串化的更多控制。

答案 1 :(得分:1)

在计算器应用中使用float作为数据类型永远不建议做到其不精确的性质。如果您将所有变量更改为double,正如名称所示,它的精度是浮点数的两倍,那么结果应该不再略微偏离。

此外,您可以考虑使用BigDecimalDecimalFormat。 BigDecimal是一个可以精确处理许多小数位的类。 DecimalFormat将允许您清理不精确的十进制数字的显示。