如何在Java中将双精度(或字符串)四舍五入到小数点后两位



虽然在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);

最新更新