Создание точечной функции для Android-калькулятора

Я делаю небольшой проект, собираю несколько случайных кодов калькулятора из сети и улучшаю их, чтобы изучать разработку на Java и Android...

Итак, в настоящее время я пытаюсь реализовать точечную функцию для этого кода калькулятора, но она не работает должным образом. Вместо точки добавляется значение 46 (почему 46??). Не могли бы вы помочь мне создать функциональную точечную функцию?

Java-код:

package com.example.Elof_Calculator;



  import android.os.Bundle;
  import android.app.Activity;
  import android.view.Menu;
  import android.view.View;
  import android.widget.Button;
  import android.widget.EditText;

  public class MainActivity extends Activity {

   public String str ="";
   Character op = 'q';
   double i,num,numtemp;
      EditText showResult;
      @Override
      public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    showResult = (EditText)findViewById(R.id.result_id);


   }
  public void btn1Clicked(View v){
   insert(1);

  }

   public void btn2Clicked(View v){
   insert(2);

  }
  public void btn3Clicked(View v){
   insert(3);

  }
  public void btn4Clicked(View v){
   insert(4);

  }
  public void btn5Clicked(View v){
   insert(5);

  }
  public void btn6Clicked(View v){
   insert(6);
  }
  public void btn7Clicked(View v){
   insert(7);

  }
  public void btn8Clicked(View v){
   insert(8);

  }
  public void btn9Clicked(View v){
   insert(9);

  }
  public void btn0Clicked(View v){
      insert(0);

     }
  public void btndotClicked(View v){
      insert('.');
      //error

     }
  public void btnplusClicked(View v){
   perform();
   op = '+';

  }

   public void btnminusClicked(View v){
      perform();
     op = '-';

  }
  public void btndivideClicked(View v){
   perform();
   op = '/';

  }
  public void btnmultiClicked(View v){
   perform();
   op = '*';

  }
  public void btnequalClicked(View v){
   calculate();

  }

   public void btnclearClicked(View v){
   reset();
  }
  private void reset() {
    // TODO Auto-generated method stub
  str ="";
  op ='q';
  num = 0;
  numtemp = 0;
  showResult.setText("");
  }
 private void insert(int j) {
    // TODO Auto-generated method stub
   str = str+Integer.toString(j);
   num = Integer.valueOf(str).intValue();
   showResult.setText(str);


  }
     private void perform() {
    // TODO Auto-generated method stub
    str = "";
    numtemp = num;
     }
      private void calculate() {
     // TODO Auto-generated method stub
     if(op == '+')
    num = numtemp+num;
   else if(op == '-')
    num = numtemp-num;
   else if(op == '/')
    num = numtemp/num;
   else if(op == '*')
    num = numtemp*num;
   showResult.setText(""+num);
     }

    }

XML-код для кнопки с точкой:

 <Button
            android:id="@+id/Btndot_id"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="70dp"
            android:layout_height="64dp"
            android:background="@drawable/buttonstyle1"
            android:gravity="center_vertical|center_horizontal"
            android:text="."
            android:textColor="@android:color/white"
            android:textSize="22sp" 
             android:onClick="btndotClicked"
            />

Вот функция Java и код конкретно для точечной функции, которая является основной ошибкой:

 public void btndotClicked(View v){
      insert('.');


     }

Итак, каким должен быть код для точечной функции? Любая помощь приветствуется :))


person Chewie    schedule 01.06.2014    source источник
comment
Подсказка: 46 — это значение ascii для символа '.' :)   -  person matiash    schedule 01.06.2014
comment
@matiash ооо, я вижу, ха-ха :)) Я пробовал с помощью вставки (.), вставки (.), str += . и некоторые другие, но ни один не работал :(   -  person Chewie    schedule 01.06.2014


Ответы (1)


Проблема в том, что ваша функция вставки имеет подпись void insert(int j)

В Java будет иметь место неявное расширяющее преобразование, если вы используете примитивный тип char, когда ожидается тип int. Так, например, это действительная Java:

int dot = '.';

Однако значение переменной int dot теперь будет равно 46, что является целым числом, соответствующим битовому шаблону, используемому для представления '.'.

Что вы можете сделать, так это изменить функцию insert, чтобы она принимала String параметров, и добавить перегрузку для int параметров. Вам также нужно будет изменить свою логику вокруг num, так как теперь вы можете иметь числа с плавающей запятой.

private void insert(int value) {
    insert(Integer.toString(value));
    ...
    num = Double.parseDouble(str);
}

private void insert(String value) {        
    ...
}

...

public void btndotClicked(View v){
    insert("."); // inserting a String instead of a char
}
person cyon    schedule 01.06.2014
comment
Большое спасибо, чувак, теперь все работает намного лучше! :D однако, когда я попробовал например 6,6*6, результат стал 39,5999999994 вместо просто 39,6 Почему? :/ С некоторыми значениями этого не происходит (например, 2,4*2 = 4,8) - person Chewie; 01.06.2014
comment
@Chewie Это связано с тем, что некоторые значения с плавающей запятой могут быть представлены только приблизительно в 64-битном двойнике. Это прискорбно и является источником большой путаницы. Взгляните на эту статью floating-point-gui.de - person cyon; 01.06.2014