안드로이드 프로그래밍에 들어가 자바를 배우려고 노력하고
내가하려고 노력 버튼
소수점 그것은 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();
}
}
예 내 문제는 주로 큰 정확도로 계산기를 만들기로 결정하기 전까지 적어도 현재는 문자열 표시와 관련이 있습니다. DecimalFormat을 사용하면 BigDecimal을 사용할 필요가없는 것처럼 보입니다. 이중 값만 사용하면됩니다. 그러나 DecimalFormat 객체가 생성 된 형식을 변경하는 방법을 찾을 수 없습니다 (예를 들어 생성자를 보여 주지만 사용자가 숫자를 입력 할 때 형식을 계속 변경해야 함). – user13267
그 문제를 제쳐두고, 소수 부분의 자릿수 만 지정하는 동안 DecimalFormat이 숫자의 정수 부분을 그대로 유지하게하려면 어떻게해야합니까? 나는 당신이 항상 소수뿐만 아니라 전체 숫자의 자릿수를 지정해야하는 것처럼 보이기 때문에 이것을 묻습니다. – user13267