账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    我的这个程序BigDecimal 为什么没有用科学计数法显示 3588966822845?
    35
    0

    问题描述

    用的是toString();

    你期待的结果是什么?实际看到的错误信息又是什么?

    我期待是用科学计数法显示 结果是直接显示

    问题出现的环境背景及自己尝试过哪些方法

    我正在制作安卓计算器

    相关代码

    // 请把代码文本粘贴到下方(请勿用图片代替代码)

    List<Button> list = new ArrayList<Button>();//按钮
    List<Integer> thisnum= new ArrayList<Integer>();//临时数字
    List<Character> stack = new ArrayList<Character>();//表达式
    Stack<Character> SOP = new Stack<Character>();//临时存储运算符和分界符(
    List<String> L = new ArrayList<String>();//后缀表达式
    Stack<BigDecimal> scalc = new Stack<BigDecimal>();//后缀表达式运算栈
    boolean ClearA = false;
    
            case R.id.buttonA://等于号
                BigDecimal re;
                ClearA=true;
                //STACKcompress() 变为后缀表示式
                if(STACKcompress()){//是否正确运行
                   re = suffixToResult();//运算
             if(!textView1.getText().equals("错误")){
                 textView.setText(re.toString());
                    }
                }else if(stack.size()==1){  //只有一个元素
                    Character character = stack.get(0);
                    if(character!='-'){
                        textView1.setText("错误");
                        stack.clear();
                    }else{
                        textView.setText('-');
                    }
                }
                return;
    

    private boolean STACKcompress() {
    //将参数中缀表达式expression转为后缀表达式存放在L中,返回L

          L.clear();
          SOP.clear();
          Log.d("stack",stack.toString());
          int dian =0;  //
          boolean  dia=false;    //
        for (int i = 0; i < stack.size(); i++)        //对表达式中的每一个元素
        {
            char element = stack.get(i);
            if ('0' <= element && element <= '9') {
                if(dia){
                    dian++;
                }
                thisnum.add(element-'0');
    
                Log.d("(int) element", String.valueOf(element-'0'));
                if(i +1==stack.size()){
                    BigDecimal ten=BigDecimal.valueOf(10);
                    BigDecimal zxc= BigDecimal.valueOf(0);
                    for(int a=0;a<thisnum.size();a++){
                        zxc=zxc.multiply(ten);
                        zxc=zxc.add(BigDecimal.valueOf(thisnum.get(a)));
                    }
                    if(dia){
                        for(int a=0;a<dian;a++){
                            zxc=zxc.divide(ten);
                        }
                        dia=false;
                        dian=0;
                    }
                    L.add(""+zxc);
                    thisnum.clear();
                    Log.d("String(zxc) i+1 ", ""+zxc);
                }
            } else if (SwitchOperator(element)) {
                if(stack.size()==1&&element!='-'){
                    Log.d("element in if",""+element);
                    return false;
                }
                if(!thisnum.isEmpty()){
                    BigDecimal ten=BigDecimal.valueOf(10);
                    BigDecimal zxc= BigDecimal.valueOf(0);
                    for(int a=0;a<thisnum.size();a++){
                        zxc=zxc.multiply(ten);
                        zxc=zxc.add(BigDecimal.valueOf(thisnum.get(a)));
                    }
                    if(dia){
                        for(int a=0;a<dian;a++){
                            zxc=zxc.divide(ten);
                        }
                        dia=false;
                        dian=0;
                    }
                    L.add(""+zxc);
                    thisnum.clear();
                    Log.d("String(zxc) i+1 ", ""+zxc);
                }
                while(SopTureOrFlase(element)) {
                    L.add(""+SOP.pop());
                }
                if(i +1!=stack.size()) {
                    SOP.push(element);
                }else if(stack.size()!=1){
                    return  false;
                }
    
            }else if(element=='.'){
                dia=true;
            }else  if(element=='%'){
                if(!thisnum.isEmpty()) {
                    BigDecimal ten=BigDecimal.valueOf(10);
                    BigDecimal zxc = BigDecimal.valueOf(0);
                    for (int a = 0; a < thisnum.size(); a++) {
                        zxc=zxc.multiply(ten);
                        zxc=zxc.add(BigDecimal.valueOf(thisnum.get(a)));
                    }
                    Log.d("thisnum", thisnum.toString());
                    thisnum.clear();
                    zxc=zxc.divide(BigDecimal.valueOf(100));
                    Log.d("zxc", "" + zxc);
                    L.add("" + zxc);
                }
            } else{
                textView.setText("警告 :不在按键中的字符出现");
                Log.e("警告","不在按键中的字符出现");
                this.onStop();
            }
        }
            while (!SOP.isEmpty())      //将sop栈中剩余的所有元素弹出,追加到L后
            {
                L.add(""+SOP.pop());
    
            }
      return true;
    }
    
    private BigDecimal suffixToResult() { //运算后缀表达式
        BigDecimal temp_value ;
    
        for (int i = 0; i < L.size(); i++) {
           String element1 = L.get(i);
           Log.d("L",L.toString());
            char element = element1.charAt(0);//获取字符串的第一个字符
            Log.d("String.valueOf(BigDecimal.valueOf(element))", String.valueOf(BigDecimal.valueOf(element)));
           if (SwitchOperator(element)) {
               Log.d("是操作符", String.valueOf(element));
                //从栈中弹出2个操作数 num1 和 num2 。注意:后弹出的num2是第一操作数,num1是第二操作数 。
                //因为这里考虑的都是二元运算符,因此需要弹2个元素出来进行运算。
               try{
                   BigDecimal num1 = scalc.pop();
                   BigDecimal num2 = scalc.pop();
    
                   switch (element) {
                       case '+':
                           temp_value = num2.add(num1) ;
                           break;
                       case '-':
                           temp_value = num2.subtract(num1) ;
                           break;
                       case '*':
                           temp_value = num2.multiply(num1);
                           break;
                       case '/':
                               temp_value = num2.divide(num1) ;
                           break;
                       default:
                           temp_value = BigDecimal .valueOf(999);
                           break;
                   }
                   //将temp_value压栈
                   TextView1("");
                   scalc.push(temp_value);
               }catch (EmptyStackException e) {
                  TextView1("错误");
                  return BigDecimal .valueOf(-1);
               }
                //使用element代表的运算符完成 num2 和 num1 的计算,产生临时结果 temp_value
            }  else {
               BigDecimal bd = new BigDecimal(element1);
              Log.d("bd", bd.toString()) ;
           scalc.push(bd);
         }
        }Log.d("scalc",scalc.toString());
         BigDecimal x=scalc.pop();
        Log.d("x",x.toString());
        return x.stripTrailingZeros();
    }
    
    
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部