在我的应用程序中我显示数字字符串并注意到“7.000444”显示为“7.00044”。另外,“0.567567”显示为“0.56757”。最后,添加任何非数字部分(即字母)使它们显示全部数字,然后显示另一个键。有没有办法阻止前两个行为?我通过将它添加到数据库然后显示在ListView中来显示它们。创建字符串的代码是一组按钮,按钮0-9是:
Button one;
one = (Button)findViewById(R.id.one);
one.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
working = BigDecimal.valueOf(1);
now = working.toString();
total1 = total.concat(now);
equation1 = equation.concat(now);
equation = equation1;
total = total1;
if(b){mnDbHelper.updateNote(equation, mnDbHelper.testCount());}
else{mnDbHelper.createNote(equation);
b=true;}
fillData();
}
});
根据需要更改1。 小数点按钮如下:
Button decimal;
decimal = (Button)findViewById(R.id.decimal);
decimal.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
now = ".";
equation1 = equation.concat(now);
total1 = total.concat(now);
equation = equation1;
total = total1;
if(b){mnDbHelper.updateNote(equation, mnDbHelper.testCount());}
else{mnDbHelper.createNote(equation);
b=true;}
fillData();
}
});
以下是FillData的代码:
private void fillData() {
// Get all of the notes from the database and create the item list
Cursor c = mnDbHelper.fetchAllNotes();
startManagingCursor(c);
String[] columns = new String[] {EquationsDbAdapter.KEY_VALUE};
int to[] = new int[] {android.R.id.text1};
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,android.R.layout.simple_list_item_1 ,c , columns , to);
setListAdapter(adapter);
}
以下是其他一个按钮的示例代码:
Button times;
times = (Button)findViewById(R.id.times);
times.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
now = "*";
equation1 = equation.concat(now);r = equation;
equation = equation1;z = equation;
if(total!="")
{try{
formatter.parse(total);
}
catch(Throwable t){
really = false;
}
if(really){
try {
mDbHelper.createNote((BigDecimal) formatter.parse(total), fa, fa, fa, fa, fa, fa, jkl, fa, fa);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
total = "";
total1 = "";}
else{really = true;}}
mDbHelper.createNote(jkl, fa, fa, t, fa, fa, fa, jkl, fa, fa);
if(b){mnDbHelper.updateNote(equation, mnDbHelper.testCount());}
else{mnDbHelper.createNote(equation);
b=true;}
fillData();
}
});
格式化程序如下:
DecimalFormat formatter = new DecimalFormat("##################################################################################.################################");
编辑:奇怪的是,显示的“0.33333333”显示不正确,但是当添加*时,确实如此,但是当再次从中减去*时它不会。 一如既往,非常感谢帮助。
答案 0 :(得分:1)
修改强>
咦。那问题似乎不在formatter
对象中。除非已调用Double
,否则会返回setParseBigDecimal(true)
,但如果您尝试将Double
转换为BigDecimal
,则会收到强制转换错误。我不认为你需要格式化程序,应该调用以下内容但我没有看到导致截断的地方:
new BigDecimal(total)
怀疑你从某个地方String
到double
或float
,这会截断BigDecimal
的精确度。例如,你确定你没有这样做:
working = BigDecimal.valueOf((double)value);
确保您使用String
的{{1}}构造函数:
BigDecimal
这会对字符串进行逐字符处理,以创建working = new BigDecimal(valueStr);
而不会丢失精度。
如果你提供更多详细信息(比如许多评论已经提出)并显示实际创建BigDecimal
的代码,那么我将编辑我的答案以提供更多信息。
代码:
BigDecimal
不对。您很少想要将字符串与if(total!="")
或==
进行比较。我怀疑应该是:
!=
或者
if (!("".equals(total)))
答案 1 :(得分:1)
这非常有趣,因为显而易见的是,double
而非BigDecimal
并非如此。
你提到了数据库。也许您从数据库重新加载字段,记录字段为DOUBLE
而非DECIMAL
,或DECIMAL
错误精度。
答案 2 :(得分:0)
我最终做的只是在字符串的开头添加一个空格,这很有效。