2013-07-15 5 views
0
내가 기본적인 산술 연산과 계산기 프로그램을 작성하는 것을 시도하고 내 연습
안드로이드 프로그래밍에 들어가 자바를 배우려고 노력하고

내가하려고 노력 버튼
소수점 그것은 int와 double과 같은 프리미티브 숫자 형을 사용하지만 double을 변수 형으로 사용하면 2.111과 같은 숫자는 2.11099999로 표시되지만 괜찮은 것처럼 보입니다 (my question about this is given here)
답안에서 제안 된대로 내 다른 질문에 double 대신 BigDecimal 데이터 형식을 사용하도록 프로그램을 수정했지만 이제는 1 단추를 클릭 할 때 double이 사용 된 이전 프로그램에서와 같이 1이 아닌 1.0으로 가수가 표시됩니다.
어떻게 해결할 수 있습니까?제대로 문자열로 BigDecimal를 표시하는 방법

public void updateMantissa(){ 

    // mantissa_valueBD = BigDecimal.valueOf(mantissa_value); 

    if(mantissa_value == BigDecimal.ZERO){ 
     mantissa_str = "0"; 
    } 
    /* 
    else if(ceil(mantissa_value) == mantissa_value){ 
     mantissa_str = String.valueOf(mantissa_valueBD); 
     mantissa_str = mantissa_str.substring(0, mantissa_str.length() - 2); 
    } 

    else{ 
     mantissa_str = String.valueOf(mantissa_valueBD); 
     mantissa_str = mantissa_str.substring(0, Math.min(mantissa_str.length(), 10)); 
    } 
    */ 

    // /* 
    else if(mantissa_value.setScale(0, RoundingMode.CEILING)== mantissa_value){ 
     // mantissa_str = String.valueOf(mantissa_value); 
     mantissa_str = mantissa_value.toString(); 
     mantissa_str = mantissa_str.substring(0, mantissa_str.length() - 4); 
    } 

    else{ 
     mantissa_str = String.valueOf(mantissa_value); 
     mantissa_str = mantissa_str.substring(0, Math.min(mantissa_str.length(), 10)); 
    } 
    // */ 
    TextView thisText = (TextView) findViewById(R.id.mantissa); 
    thisText.setText(mantissa_str); 
} 

전체 코드 (MainActivity 클래스) :

코드는 가수를 업데이트

package com.example.calculator; 

import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.view.View; 
import android.widget.TextView; 
import static java.lang.Math.pow; 
// import static java.lang.Math.ceil; 
import java.math.BigDecimal; 
import java.math.RoundingMode; 

public class MainActivity extends Activity { 
// private double mantissa_value = 0; 
// private BigDecimal mantissa_value = new BigDecimal(0); 
// private BigDecimal opr1BD, opr2BD, resBD, mantissa_valueBD; 
/* 
private double opr1 = 0; 
private double opr2 = 0; 
private double res = 0; 
// */ 

BigDecimal opr1 = BigDecimal.ZERO; 
BigDecimal opr2 = BigDecimal.ZERO; 
BigDecimal res = BigDecimal.ZERO; 
BigDecimal tempBD = BigDecimal.ZERO; 
BigDecimal mantissa_value = BigDecimal.ZERO; 

private enum OprTypes {NONE, PLUS, MINUS, MULT, DIV} 
OprTypes oprLatest = OprTypes.NONE; 
private boolean oprPlusClicked = false; 
private boolean oprMinusClicked = false; 
private boolean oprMultClicked = false; 
private boolean oprDivClicked = false; 
private boolean decimalClicked = false; 
private int numOfClicksAfterDecimal = 0; 
private String mantissa_str; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    updateMantissa(); 
} 

@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 updateMantissa(){ 

    // mantissa_valueBD = BigDecimal.valueOf(mantissa_value); 

    if(mantissa_value == BigDecimal.ZERO){ 
     mantissa_str = "0"; 
    } 
    /* 
    else if(ceil(mantissa_value) == mantissa_value){ 
     mantissa_str = String.valueOf(mantissa_valueBD); 
     mantissa_str = mantissa_str.substring(0, mantissa_str.length() - 2); 
    } 

    else{ 
     mantissa_str = String.valueOf(mantissa_valueBD); 
     mantissa_str = mantissa_str.substring(0, Math.min(mantissa_str.length(), 10)); 
    } 
    */ 

    // /* 
    else if(mantissa_value.setScale(0, RoundingMode.CEILING)== mantissa_value){ 
     // mantissa_str = String.valueOf(mantissa_value); 
     mantissa_str = mantissa_value.toString(); 
     mantissa_str = mantissa_str.substring(0, mantissa_str.length() - 4); 
    } 

    else{ 
     mantissa_str = String.valueOf(mantissa_value); 
     mantissa_str = mantissa_str.substring(0, Math.min(mantissa_str.length(), 10)); 
    } 
    // */ 
    TextView thisText = (TextView) findViewById(R.id.mantissa); 
    thisText.setText(mantissa_str); 
} 

public void onClkBn0(View view){ 
    TextView thisText = (TextView) findViewById(R.id.mantissa); 
    if(decimalClicked == false){ 
     tempBD = mantissa_value.multiply(BigDecimal.valueOf(10.0)); 
     mantissa_value = mantissa_value.add(BigDecimal.valueOf(0.0)); 
     updateMantissa(); 
    } 
    else{ 
     if(mantissa_value == BigDecimal.ZERO){ 
      if(numOfClicksAfterDecimal == 1){ 
       mantissa_str = mantissa_str + ".0"; 
      } 
      else{ 
       mantissa_str = mantissa_str + "0"; 
      } 
     } 

     else if(mantissa_value.setScale(0, RoundingMode.CEILING)== mantissa_value){ 
      if(numOfClicksAfterDecimal == 1){ 
       mantissa_str = mantissa_str + ".0"; 
      } 
      else{ 
       mantissa_str = mantissa_str + "0"; 
      } 
     } 

     // mantissa_value = mantissa_value + pow(10, -numOfClicksAfterDecimal)*0; 
     tempBD = BigDecimal.valueOf(pow(10, -numOfClicksAfterDecimal)*0); 
     mantissa_value = mantissa_value.add(tempBD); 
     numOfClicksAfterDecimal++; 
     thisText.setText(mantissa_str); 
    } 
} 

public void onClkBn1(View view){ 
    if(decimalClicked == false){ 
     // mantissa_value = mantissa_value*10+1; 
     tempBD = mantissa_value.multiply(BigDecimal.valueOf(10.0)); 
     mantissa_value = tempBD.add(BigDecimal.valueOf(1.0)); 
    } 

    else{ 
     // mantissa_value = mantissa_value + pow(10, -numOfClicksAfterDecimal)*1; 
     tempBD = BigDecimal.valueOf(pow(10, -numOfClicksAfterDecimal)*1); 
     mantissa_value = mantissa_value.add(tempBD); 
     numOfClicksAfterDecimal++; 
    } 
    updateMantissa(); 
} 

public void onClkBn2(View view){ 
    if(decimalClicked == false){ 
     // mantissa_value = mantissa_value*10+2; 
     tempBD = mantissa_value.multiply(BigDecimal.valueOf(10.0)); 
     mantissa_value = tempBD.add(BigDecimal.valueOf(2.0)); 
    } 
    else{ 
     // mantissa_value = mantissa_value + pow(10, -numOfClicksAfterDecimal)*2; 
     tempBD = BigDecimal.valueOf(pow(10, -numOfClicksAfterDecimal)*2); 
     mantissa_value = mantissa_value.add(tempBD); 
     numOfClicksAfterDecimal++; 
    } 
    updateMantissa(); 
} 

public void onClkBn3(View view){ 
    if(decimalClicked == false){ 
     // mantissa_value = mantissa_value*10+3; 
     tempBD = mantissa_value.multiply(BigDecimal.valueOf(10.0)); 
     mantissa_value = tempBD.add(BigDecimal.valueOf(3.0)); 
    } 
    else{ 
     // mantissa_value = mantissa_value + pow(10, -numOfClicksAfterDecimal)*3; 
     tempBD = BigDecimal.valueOf(pow(10, -numOfClicksAfterDecimal)*3); 
     mantissa_value = mantissa_value.add(tempBD); 
     numOfClicksAfterDecimal++; 
    } 
    updateMantissa(); 
} 

public void onClkBn4(View view){ 
    if(decimalClicked == false){ 
     // mantissa_value = mantissa_value*10+4; 
     tempBD = mantissa_value.multiply(BigDecimal.valueOf(10.0)); 
     mantissa_value = tempBD.add(BigDecimal.valueOf(4.0)); 
    } 
    else{ 
     // mantissa_value = mantissa_value + pow(10, -numOfClicksAfterDecimal)*4; 
     tempBD = BigDecimal.valueOf(pow(10, -numOfClicksAfterDecimal)*4); 
     mantissa_value = mantissa_value.add(tempBD); 
     numOfClicksAfterDecimal++; 
    } 
    updateMantissa(); 
} 

public void onClkBn5(View view){ 
    if(decimalClicked == false){ 
     // mantissa_value = mantissa_value*10+5; 
     tempBD = mantissa_value.multiply(BigDecimal.valueOf(10.0)); 
     mantissa_value = tempBD.add(BigDecimal.valueOf(5.0)); 
    } 
    else{ 
     // mantissa_value = mantissa_value + pow(10, -numOfClicksAfterDecimal)*5; 
     tempBD = BigDecimal.valueOf(pow(10, -numOfClicksAfterDecimal)*5); 
     mantissa_value = mantissa_value.add(tempBD); 
     numOfClicksAfterDecimal++; 
    } 
    updateMantissa(); 
} 

public void onClkBn6(View view){ 
    if(decimalClicked == false){ 
     // mantissa_value = mantissa_value*10+6; 
     tempBD = mantissa_value.multiply(BigDecimal.valueOf(10.0)); 
     mantissa_value = tempBD.add(BigDecimal.valueOf(6.0)); 
    } 
    else{ 
     // mantissa_value = mantissa_value + pow(10, -numOfClicksAfterDecimal)*6; 
     tempBD = BigDecimal.valueOf(pow(10, -numOfClicksAfterDecimal)*6); 
     mantissa_value = mantissa_value.add(tempBD); 
     numOfClicksAfterDecimal++; 
    } 
    updateMantissa(); 
} 

public void onClkBn7(View view){ 
    if(decimalClicked == false){ 
     // mantissa_value = mantissa_value*10+7; 
     tempBD = mantissa_value.multiply(BigDecimal.valueOf(10.0)); 
     mantissa_value = tempBD.add(BigDecimal.valueOf(7.0)); 
    } 
    else{ 
     // mantissa_value = mantissa_value + pow(10, -numOfClicksAfterDecimal)*7; 
     tempBD = BigDecimal.valueOf(pow(10, -numOfClicksAfterDecimal)*7); 
     mantissa_value = mantissa_value.add(tempBD); 
     numOfClicksAfterDecimal++; 
    } 
    updateMantissa(); 
} 

public void onClkBn8(View view){ 
    if(decimalClicked == false){ 
     // mantissa_value = mantissa_value*10+8; 
     tempBD = mantissa_value.multiply(BigDecimal.valueOf(10.0)); 
     mantissa_value = tempBD.add(BigDecimal.valueOf(8.0)); 
    } 
    else{ 
     // mantissa_value = mantissa_value + pow(10, -numOfClicksAfterDecimal)*8; 
     tempBD = BigDecimal.valueOf(pow(10, -numOfClicksAfterDecimal)*8); 
     mantissa_value = mantissa_value.add(tempBD); 
     numOfClicksAfterDecimal++; 
    } 
    updateMantissa(); 
} 

public void onClkBn9(View view){ 
    if(decimalClicked == false){ 
     // mantissa_value = mantissa_value*10+9; 
     tempBD = mantissa_value.multiply(BigDecimal.valueOf(10.0)); 
     mantissa_value = tempBD.add(BigDecimal.valueOf(9.0)); 
    } 
    else{ 
     // mantissa_value = mantissa_value + pow(10, -numOfClicksAfterDecimal)*9; 
     tempBD = BigDecimal.valueOf(pow(10, -numOfClicksAfterDecimal)*9); 
     mantissa_value = mantissa_value.add(tempBD); 
     numOfClicksAfterDecimal++; 
    } 
    updateMantissa(); 
} 

public void onClkBnDot(View view){ 
    decimalClicked = true; 
} 

public void onClkBnCan(View view){ 
    mantissa_value = BigDecimal.ZERO; 
    opr1 = BigDecimal.ZERO; 
    opr2 = BigDecimal.ZERO; 
    res = BigDecimal.ZERO; 
    /* 
    opr1 = 0; 
    opr2 = 0; 
    res = 0; 
    // */ 
    oprLatest = OprTypes.NONE; 
    oprPlusClicked = false; 
    oprMinusClicked = false; 
    oprMultClicked = false; 
    oprDivClicked = false; 
    decimalClicked = false; 
    numOfClicksAfterDecimal = 1; 
} 


public void onClkBnPlus(View view){ 
    if(oprPlusClicked == false){ 
     oprPlusClicked = true; 
     opr1 = mantissa_value; 
     // mantissa_value = 0; 
     mantissa_value = BigDecimal.ZERO; 
    } 
    else{ 
     // this should mean opr1 already has some value in it 
     // so add the current mantissa value to opr1 
     // opr1 = opr1 + mantissa_value; 
     opr1 = opr1.add(mantissa_value); 
     mantissa_value = BigDecimal.ZERO; 
    } 
    oprLatest = OprTypes.PLUS; 
} 


public void onClkBnMinus(View view){ 
    if(oprMinusClicked == false){ 
     oprMinusClicked = true; 
     opr1 = mantissa_value; 
     mantissa_value = BigDecimal.ZERO; 
    } 
    else{ 
     // this should mean opr1 already has some value in it 
     // so add the current mantissa value to opr1 
     // opr1 = opr1 - mantissa_value; 
     opr1 = opr1.subtract(mantissa_value); 
     mantissa_value = BigDecimal.ZERO; 
    } 
    oprLatest = OprTypes.MINUS; 
} 

public void onClkBnMult(View view){ 
    if(oprMultClicked == false){ 
     oprMultClicked = true; 
     opr1 = mantissa_value; 
     mantissa_value = BigDecimal.ZERO; 
    } 
    else{ 
     // this should mean opr1 already has some value in it 
     // so add the current mantissa value to opr1 
     // opr1 = opr1 * mantissa_value; 
     opr1 = opr1.multiply(mantissa_value); 
     mantissa_value = BigDecimal.ZERO; 
    } 
    oprLatest = OprTypes.MULT; 
} 

public void onClkBnDiv(View view){ 
    if(oprDivClicked == false){ 
     oprDivClicked = true; 
     opr1 = mantissa_value; 
     mantissa_value = BigDecimal.ZERO; 
    } 
    else{ 
     // this should mean opr1 already has some value in it 
     // so add the current mantissa value to opr1 
     // opr1 = opr1/mantissa_value; 
     opr1 = opr1.divide(mantissa_value); 
     mantissa_value = BigDecimal.ZERO; 
    } 
    oprLatest = OprTypes.DIV; 
} 


public void onClkBnRes(View view){ 
    if(oprPlusClicked == true || oprMinusClicked == true || oprMultClicked == true || oprDivClicked == true){ 
     switch(oprLatest){ 
     case PLUS: 
      // mantissa_value = opr1 + mantissa_value; 
      mantissa_value = opr1.add(mantissa_value); 
      break; 
     case MINUS: 
      // mantissa_value = opr1 - mantissa_value; 
      mantissa_value = opr1.subtract(mantissa_value); 
      break; 
     case MULT: 
      // mantissa_value = opr1 * mantissa_value; 
      mantissa_value = opr1.multiply(mantissa_value); 
      break; 
     case DIV: 
      // mantissa_value = opr1/mantissa_value; 
      mantissa_value = opr1.divide(mantissa_value); 
      break; 
     case NONE: 
      break; 
     } 
    } 
    oprLatest = OprTypes.NONE; 
    oprPlusClicked = false; 
    oprMinusClicked = false; 
    oprMultClicked = false; 
    oprDivClicked = false; 
    updateMantissa(); 
} 
} 

------ 수정 ------
내가 좋아하는 뭔가를 할 경우 이

public static void main(String[] args){ 
    // double a; 
    a = 2.111; 
    System.out.println(a); 
} 

정확히 2.1109999 대신 2.111을 표시합니다. 왜 그런가요?

------ 편집 2 ------

나는 내 프로그램의 논리를 변경 한 한을 사용하는 반면 지금, 표시와 관련된 어떤 것도 수행 할 문자열에 작동하도록 Double.parseDouble() 함수는 가수 문자열 값을 double로 변환하여 계산과 관련된 작업을 수행합니다. 누구나 코멘트하고 싶다면 아래에 업데이트 된 코드가 주어진다.

package com.example.calculator; 

import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.view.View; 
import android.widget.TextView; 
import static java.lang.Math.pow; 
import static java.lang.Math.ceil; 
// import java.math.BigDecimal; 
import java.text.NumberFormat; 

public class MainActivity extends Activity { 

    private double mantissa_value = 0; 
    // private BigDecimal mantissa_value = new BigDecimal(0); 
    // private BigDecimal opr1BD, opr2BD, resBD, mantissa_valueBD; 
    // /* 
    private double opr1 = 0; 
    // */ 
    NumberFormat number = NumberFormat.getNumberInstance(); 

    private enum OprTypes {NONE, PLUS, MINUS, MULT, DIV} 
    OprTypes oprLatest = OprTypes.NONE; 
    private boolean oprPlusClicked = false; 
    private boolean oprMinusClicked = false; 
    private boolean oprMultClicked = false; 
    private boolean oprDivClicked = false; 
    private boolean decimalClicked = false; 
    private boolean resetMantissa = true; 
    private String mantissa_str; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     // updateMantissa(); 
    } 

    @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 updateMantissa(){ 
     // This is the version that should get called from the num pad buttons, 0 - 9 
     updateMantissa(true); 
    } 
    public void updateMantissa(boolean frmNumPad){ 
     // this is the version that should get called from other buttons besides the num pad buttons 
     if(frmNumPad != true){ 
      long mantissa_val_int_part = (long)mantissa_value; 
      if(mantissa_value == (double)mantissa_val_int_part){ 
       mantissa_str = mantissa_str.substring(0, mantissa_str.length() - 2); 
      } 
      else if (mantissa_str.length() > 10){ 
       mantissa_str = mantissa_str.substring(0, Math.min(mantissa_str.length(), 10)); 
      } 

     } 


     TextView thisText = (TextView) findViewById(R.id.mantissa); 
     thisText.setText(mantissa_str); 
    } 

    public void onClkBn0(View view){ 
     if (resetMantissa == true){ 
      mantissa_str = ""; 
      resetMantissa = false; 
     } 

     if(decimalClicked == false){ 
      if(!(Double.parseDouble(mantissa_str)==0.0)) 
       mantissa_str = mantissa_str + "0"; 
     } 
     else{ 
      mantissa_str = mantissa_str + "0"; 
     } 
     TextView thisText = (TextView) findViewById(R.id.mantissa); 
     thisText.setText(mantissa_str); 
    } 

    public void onClkBn1(View view){ 
     if (resetMantissa == true){ 
      mantissa_str = ""; 
      resetMantissa = false; 
     } 
     mantissa_str = mantissa_str + "1"; 
     mantissa_value = Double.parseDouble(mantissa_str); 
     updateMantissa(); 
    } 

    public void onClkBn2(View view){ 
     if (resetMantissa == true){ 
      mantissa_str = ""; 
      resetMantissa = false; 
     } 
     mantissa_str = mantissa_str + "2"; 
     mantissa_value = Double.parseDouble(mantissa_str); 
     updateMantissa(); 
    } 

    public void onClkBn3(View view){ 
     if (resetMantissa == true){ 
      mantissa_str = ""; 
      resetMantissa = false; 
     } 
     mantissa_str = mantissa_str + "3"; 
     mantissa_value = Double.parseDouble(mantissa_str); 
     updateMantissa(); 
    } 

    public void onClkBn4(View view){ 
     if (resetMantissa == true){ 
      mantissa_str = ""; 
      resetMantissa = false; 
     } 
     mantissa_str = mantissa_str + "4"; 
     mantissa_value = Double.parseDouble(mantissa_str); 
     updateMantissa(); 
    } 

    public void onClkBn5(View view){ 
     if (resetMantissa == true){ 
      mantissa_str = ""; 
      resetMantissa = false; 
     } 
     mantissa_str = mantissa_str + "5"; 
     mantissa_value = Double.parseDouble(mantissa_str); 
     updateMantissa(); 
    } 

    public void onClkBn6(View view){ 
     if (resetMantissa == true){ 
      mantissa_str = ""; 
      resetMantissa = false; 
     } 
     mantissa_str = mantissa_str + "6"; 
     mantissa_value = Double.parseDouble(mantissa_str); 
     updateMantissa(); 
    } 

    public void onClkBn7(View view){ 
     if (resetMantissa == true){ 
      mantissa_str = ""; 
      resetMantissa = false; 
     } 
     mantissa_str = mantissa_str + "7"; 
     mantissa_value = Double.parseDouble(mantissa_str); 
     updateMantissa(); 
    } 

    public void onClkBn8(View view){ 
     if (resetMantissa == true){ 
      mantissa_str = ""; 
      resetMantissa = false; 
     } 
     mantissa_str = mantissa_str + "8"; 
     mantissa_value = Double.parseDouble(mantissa_str); 
     updateMantissa(); 
    } 

    public void onClkBn9(View view){ 
     if (resetMantissa == true){ 
      mantissa_str = ""; 
      resetMantissa = false; 
     } 
     mantissa_str = mantissa_str + "9"; 
     mantissa_value = Double.parseDouble(mantissa_str); 
     updateMantissa(); 
    } 

    public void onClkBnDot(View view){ 
     if(decimalClicked == false){ 
      decimalClicked = true; 
      mantissa_str = mantissa_str + "."; 
     } 
    } 

    public void onClkBnCan(View view){ 
     mantissa_value = 0; 
     // /* 
     opr1 = 0; 
     // */ 
     oprLatest = OprTypes.NONE; 
     oprPlusClicked = false; 
     oprMinusClicked = false; 
     oprMultClicked = false; 
     oprDivClicked = false; 
     decimalClicked = false; 
     mantissa_value = 0; 
     opr1 = 0; 
     resetMantissa = true; 
     updateMantissa(false); 
    } 


    public void onClkBnPlus(View view){ 
     if(oprPlusClicked == false){ 
      oprPlusClicked = true; 
      decimalClicked = false; 
      opr1 = Double.parseDouble(mantissa_str); 
      mantissa_value = 0; 
     } 
     else{ 
      // this should mean opr1 already has some value in it 
      // so add the current mantissa value to opr1 
      mantissa_value = Double.parseDouble(mantissa_str); 
      opr1 = opr1 + mantissa_value; 
      mantissa_value = opr1; 
      decimalClicked = false; 
      mantissa_str = Double.toString(mantissa_value); 
      updateMantissa(false); 
     } 
     oprLatest = OprTypes.PLUS; 
     resetMantissa = true; 
    } 


    public void onClkBnMinus(View view){ 
     if(oprMinusClicked == false){ 
      oprMinusClicked = true; 
      decimalClicked = false; 
      opr1 = Double.parseDouble(mantissa_str); 
      mantissa_value = 0; 
     } 
     else{ 
      // this should mean opr1 already has some value in it 
      // so add the current mantissa value to opr1 
      mantissa_value = Double.parseDouble(mantissa_str); 
      opr1 = opr1 - mantissa_value; 
      mantissa_value = opr1; 
      decimalClicked = false; 
      mantissa_str = Double.toString(mantissa_value); 
      updateMantissa(false); 
     } 
     oprLatest = OprTypes.MINUS; 
     resetMantissa = true; 
    } 

    public void onClkBnMult(View view){ 
     if(oprMultClicked == false){ 
      oprMultClicked = true; 
      decimalClicked = false; 
      opr1 = Double.parseDouble(mantissa_str); 
      mantissa_value = 0; 
     } 
     else{ 
      // this should mean opr1 already has some value in it 
      // so add the current mantissa value to opr1 
      mantissa_value = Double.parseDouble(mantissa_str); 
      opr1 = opr1 * mantissa_value; 
      mantissa_value = opr1; 
      decimalClicked = false; 
      mantissa_str = Double.toString(mantissa_value); 
      updateMantissa(false); 
     } 
     oprLatest = OprTypes.MULT; 
     resetMantissa = true; 
    } 

    public void onClkBnDiv(View view){ 
     if(oprDivClicked == false){ 
      oprDivClicked = true; 
      decimalClicked = false; 
      opr1 = Double.parseDouble(mantissa_str); 
      mantissa_value = 0; 
     } 
     else{ 
      // this should mean opr1 already has some value in it 
      // so add the current mantissa value to opr1 
      mantissa_value = Double.parseDouble(mantissa_str); 
      opr1 = opr1/mantissa_value; 
      mantissa_value = opr1; 
      decimalClicked = false; 
      mantissa_str = Double.toString(mantissa_value); 
      updateMantissa(false); 
     } 
     oprLatest = OprTypes.DIV; 
     resetMantissa = true; 
    } 


    public void onClkBnRes(View view){ 
     mantissa_value = Double.parseDouble(mantissa_str); 
     if(oprPlusClicked == true || oprMinusClicked == true || oprMultClicked == true || oprDivClicked == true){ 
      switch(oprLatest){ 
      case PLUS: 
       mantissa_value = opr1 + mantissa_value; 
       break; 
      case MINUS: 
       mantissa_value = opr1 - mantissa_value; 
       break; 
      case MULT: 
       mantissa_value = opr1 * mantissa_value; 
       break; 
      case DIV: 
       mantissa_value = opr1/mantissa_value; 
       break; 
      case NONE: 
       break; 
      } 
     } 
     oprLatest = OprTypes.NONE; 
     oprPlusClicked = false; 
     oprMinusClicked = false; 
     oprMultClicked = false; 
     oprDivClicked = false; 
     decimalClicked = false; 
     mantissa_str = Double.toString(mantissa_value); 
     updateMantissa(false); 
    } 

    public void onClkBnOff(View view){ 
     finish(); 
    } 

} 

답변

1

, 그것은 분명하지 않다. 원래의 질문에있는 사람들은 BigDecimal에 찬사를 보냈지 만 귀하의 원래 관심사가 후자와 관련이 있다는 느낌을 가지고 있습니다. 즉, 가치를 인쇄하는 것입니다. 이것이 바로 당신이 직면 한 것입니다.

String.valueOf()을 사용하여 이중 값을 인쇄하는 것은 절대로 안됩니다. 배후에서 일어나는 일은 부동 소수점 값을 기본 로케일을 기반으로하는 문자열로 변환하기 위해 변환이 수행된다는 것입니다. 시스템에서 전환을 수행하는 대신 전환을 직접 수행해야합니다.

그 방법은 DecimalFormat 클래스입니다. 예제 코드 :

double mantissa_value = 2.11099999; 

DecimalFormat df = new DecimalFormat("0.###"); 
// Un-comment the line below to take English locale into account when converting 
//df.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.ENGLISH)); 

// will print '2.11099999' this is what you get in your original case 
System.out.println(String.valueOf(mantissa_value)); 

// will print '2.111' or '2,111' depending on your locale. if you uncomment the line above for English locale it will print '2.111' 
System.out.println(df.format(mantissa_value)); 

위의 10 진수 형식은 십진수 뒤에 1, 2 또는 3 자리수의 double 값을 인쇄합니다. 가변 정밀도가 필요한 경우 사용자가 문자를 입력 할 때 변수에 카운터를 유지 한 다음 해당 카운터를 사용하여 원하는 십진수로 DecimalFormat을 생성 할 수 있습니다. BigDecimal 경우에도 동일한 방법을 사용할 수 있습니다. 그게 도움이 되었으면 좋겠다

+0

예 내 문제는 주로 큰 정확도로 계산기를 만들기로 결정하기 전까지 적어도 현재는 문자열 표시와 관련이 있습니다. DecimalFormat을 사용하면 BigDecimal을 사용할 필요가없는 것처럼 보입니다. 이중 값만 사용하면됩니다. 그러나 DecimalFormat 객체가 생성 된 형식을 변경하는 방법을 찾을 수 없습니다 (예를 들어 생성자를 보여 주지만 사용자가 숫자를 입력 할 때 형식을 계속 변경해야 함). – user13267

+0

그 문제를 제쳐두고, 소수 부분의 자릿수 만 지정하는 동안 DecimalFormat이 숫자의 정수 부분을 그대로 유지하게하려면 어떻게해야합니까? 나는 당신이 항상 소수뿐만 아니라 전체 숫자의 자릿수를 지정해야하는 것처럼 보이기 때문에 이것을 묻습니다. – user13267

1

기본적으로 두 가지 방법 만 표시한다. 숫자를 표시하기 전에 다음과 같은 작은 코드를 추가하면 도움이됩니다.

BigDecimal chk=BigDecimal.valueOf(val); 
BigDecimal chk3=chk.subtract(BigDecimal.valueOf(chk.intValue())); 
if(chk3.compareTo(BigDecimal.ZERO)==0) 
    System.out.print(BigDecimal.valueOf(chk.intValue())); 
else 
    System.out.print(chk); 

chk은 표시하려는 값입니다. 단지 int 값인 chk3을 추가하면됩니다. 이 코드는 50.150.1을, 50.0050을 인쇄합니다. 희망이 도움이됩니다.

--EDIT--

코드에서 다른 오류가 발견되었습니다. 당신은 일을 :

tempBD = mantissa_value.multiply(BigDecimal.valueOf(10.0)); 10.0에 가까운 값이 저장 될 때 이것은 잘못된 것입니다,하지만 당신은 정확히 10.0을 원하는이, 당신이해야 할 :

tempBD = mantissa_value.multiply(BigDecimal.valueOf("10.0"));

그래서 무효 onClkBn1(View view)에 대한 수정 된 코드가있다

public void onClkBn1(View view){ 
if(decimalClicked == false){ 
    // mantissa_value = mantissa_value*10+1; 
    tempBD = mantissa_value.multiply(BigDecimal.valueOf("10.0")); 
    mantissa_value = tempBD.add(BigDecimal.valueOf("1.0")); 
} 

else{ 
    // mantissa_value = mantissa_value + pow(10, -numOfClicksAfterDecimal)*1; 
    tempBD = BigDecimal.valueOf(pow(10, -numOfClicksAfterDecimal)*1); 
    mantissa_value = mantissa_value.add(tempBD); 
    numOfClicksAfterDecimal++; 
} 
updateMantissa(); 
} 

을 그리고 당신은 tempBD = BigDecimal.valueOf(pow(10, -numOfClicksAfterDecimal)*1); 그것이 Math.pow(double, double)이어야한다 사용하는 방법을 잘 모르겠습니다 : 다음. 그러니 너무 확인해보십시오.당신의 관심사는 부동 정밀 문제 나 부동 인쇄 문제가되는 경우 또한 당신이에 연결된 질문을 읽어

+0

다른 문제가 여전히 지속되면 어떤 점을 알려주시겠습니까? –

+0

제안에 감사드립니다. 그러나 모든 변수를 BigDecimal로 변환 했으므로 BigDecimal.valueOf()가 더 이상 작동하지 않습니다. 게다가,이 코드 스 니펫을 올바르게 이해하면 1.0 문제로 나타나는 1을 해결할 수 있지만 2.111은 2.11099999 문제로 나타나는 것이 아닙니다. 다른 제안? – user13267

+0

그러나 BigDecimal을 사용하는 경우 2.1109999로 나타나는 2.111이 절대로 발생해서는 안됩니다. 그런 다음 BigDecimal을 잘못 사용하고 있습니다. 나는 너의 실수를 발견했다. 그것은 지금 잘 실행되어야합니다 :) –

관련 문제