虽然在StackO中有许多四舍五入的问题。,我不能把它翻译成我的多部分问题。(我不知道为什么我帖子顶部的链接说"答案在这里"…因为这对我来说更像是一种资源,一种对于初学者来说很难筛选的资源。我不会在我的帖子上给出答案,只是通过查看所有的对话并分析该页面上的RoundingMode链接。我看到部分正确的代码在那里,但只有在知道答案的人向我指出之后。
1。我需要四舍五入我的finalBill TextView字段,使它是小数点后2位。我听说使用BigDecimal很好,但不知道如何编写它,或者在我的代码中放置它(我是初学者)。
2。在转换为字符串之前,将双变量(在我的onClick方法中)四舍五入会更明智吗?或者是更好的四舍五入是在一个字符串(在finalBill TextView字段)交付的最终答案?
现在,我得到的最终答案后面有很多很多小数。我只需要2。
背景:我正在创建一个提示计算器,当onClick方法执行每个按钮(10%,15%和20%)…这应该计算包含小费的新总账单,并给出不超过2小数点的数字答案(已经转换为TextView)。谢谢你的帮助!
这是我的代码:我只包括包括第一个方法onTen的金额,因为这个方法是计算小费的地方,需要进行四舍五入。(为简单起见,不包括其他按钮)。
package com.example.nonitips;
import java.math.BigDecimal;
import java.math.RoundingMode;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity {
private EditText originalBill;
private double billWithTip;
String billString;
private TextView finalBill;
private Button btnTen;
private Button btnFifteen;
private Button btnTwenty;
double rounder = billWithTip;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
originalBill = (EditText)findViewById(R.id.originalBill);
}
public void onTen (View v) {
//Toast.makeText(this, "Tipping at 10%", Toast.LENGTH_SHORT).show();
btnTen = (Button)findViewById(R.id.btnTen);
//The button gets the setOnClickListener
btnTen.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
double bill = Double.parseDouble(originalBill.getText().toString());
billWithTip = bill * 1.10;
//Turns the answer back into a string
String billString = String.valueOf(billWithTip);
finalBill = (TextView)findViewById(R.id.finalBill);
finalBill.setText(billString);
}
});
}
}
我明白你的意思了
BigDecimal n = new BigDecimal("1.1111111111111");
n = n.setScale(2, BigDecimal.ROUND_CEILING);
第一个问题:
1)。我建议您使用下面说明的方法:
如何在Java中四舍五入到小数点后n位。
第二个:
2)。我个人会把最后的答案四舍五入。
编辑:在Dave指出的许多bug之后,这是最终的代码:
代替语句:
double bill = Double.parseDouble(originalBill.getText().toString());
你需要写并添加:
BigDecimal bill = new BigDecimal(originalBill.getText().toString());
BigDecimal tax = new BigDecimal("1.10");
BigDecimal billWithTax = modifiedBill.multiply(tax);
BigDecimal roundedBill = billWithTax.setScale(2,RoundingMode.HALF_UP);
并将代码中的下一行更改为:
String billString = String.valueOf(roundedBill);
还需要导入
java.math.BigDecimal;
java.math.RoundingMode;
另外,请注意,您必须将先前的billWithTax声明更改为double。
使用这个方法:
public static String getDoubleAsFormattedDoubleToEdit(String valueS) {
DecimalFormatSymbols simbolos = new DecimalFormatSymbols();
simbolos.setGroupingSeparator(',');
simbolos.setDecimalSeparator('.');
double value = Double.valueOf(Util.typeCorrection(ETipoDato.FLOTANTE, 0, true, valueS));
return new DecimalFormat("###.##", simbolos).format(value);
}
通过这种方式,你可以传递你的值,并返回你格式化的值
使用DecimalFormat对象。
float f = 9.999f;
DecimalFormat df = new DecimalFormat("00.00");
System.out.println(df.format(f));
将打印10.00。不要使用BigDecimal,它比DecimalFormat慢。
9.999f是要舍入的值。但是你也可以使用双精度值:
double bill = Double.parseDouble(originalBill.getText().toString());
billWithTip = bill * 1.10;
DecimalFormat df = new DecimalFormat("#.##");
// the #.## means that you want 2 decimals places
billString = df.format(billWithTip);