Java中如何将数字保留两位小数?

284

我阅读了很多stackoverflow问题,但没有一个似乎适用于我。我正在使用math.round()进行四舍五入。 这是代码:

class round{
    public static void main(String args[]){

    double a = 123.13698;
    double roundOff = Math.round(a*100)/100;

    System.out.println(roundOff);
}
}

我得到的输出是:123 但我想要它是 123.14。我读到添加 *100/100 将会有帮助,但是如您所见,我没有成功让它工作。

对于输入和输出来说,都必须是 double 类型非常重要。

如果您能更改上面代码中的第四行并发布它,那将是非常大的帮助。


4
以上使用的“100/100技术”,我认为你想截断而不是四舍五入。Math.floor(a * 100)/ 100d)请思考数学的作用:123.1299 * 100 = 12312.99。Floor()= 12312.0,然后/100 = 123.12。 - Tony Ennis
https://dev59.com/Pmgu5IYBdhLWcg3w8bhs#10959430 是最佳解决方案。它有效地运行。 - Günay Gültekin
2
尝试使用Math.round(a * 100) / 100d; - Baked Inhalf
12个回答

569

嗯,这个有效...

double roundOff = Math.round(a * 100.0) / 100.0;

输出结果为

123.14

如Rufein所说

 double roundOff = (double) Math.round(a * 100) / 100;

这样做也可以解决你的问题。


11
这能否调整为四舍五入到三位或五位小数? - Muhammad Gelbana
5
这段代码的作用是将变量"a"乘以100后四舍五入保留两位小数,并将结果转换为双精度浮点型数据类型。具体实现方法是先将乘积进行四舍五入,再除以100。 - Rufein
7
为什么没有人提到 new BigDecimal(123.13698).round(new MathContext(5)).doubleValue() 的原因仍然令人困惑。 - george_h
3
(Math.round(395.0349999999 * 100 ) / 100.0) 将变成 395.03。我可以理解这是因为 395034 是最接近的整数,然后再除以 100。不过一般来说,人们都会希望结果是 395.04。 - Vishal Saxena
3
如果有人期望结果为395.04,那么他们是错误的。395.0349999999 更接近于 395.03,因此 395.03 才是正确的答案。 - DodgyCodeException
显示剩余14条评论

116
     double d = 2.34568;
     DecimalFormat f = new DecimalFormat("##.00");
     System.out.println(f.format(d));

20
你导入了java.text.DecimalFormat吗? - amitchhajer
2
只有当双精度数字不小于1且不大于-1时,才能正常工作。如果出现这种情况,它将不会显示0。 - lukaszrys
1
double doubleValue = 245; DecimalFormat df = new DecimalFormat("##.00"); System.out.println("value: " + Float.valueOf(df.format(doubleValue))); 打印出的是 245.0 而不是 245.00 - Anushree Acharjee
Decimal Format的所有函数都不会对最后一位小数进行四舍五入。所有函数的四舍五入边界都大于5,但应该大于4。例如-1.235应该四舍五入为1.24,但DF格式化将其舍入为1.23,这是错误的。 但是Math.round是准确的。 - Arunchunaivendan
但是如果您之后想要使用这个数字呢?再次解析它?那不是一个可行的选项。 - martyglaubitz
显示剩余8条评论

81
String roundOffTo2DecPlaces(float val)
{
    return String.format("%.2f", val);
}

2
@CarlosA.Junior,你认为使用上述方法不会得到一致的结果吗? - Arun
4
是的,@Arun。使用String.format,我可以以与我的国家相同的方式格式化四舍五入税款的小数位数。 - Carlos Spohr

59
BigDecimal a = new BigDecimal("123.13698");
BigDecimal roundOff = a.setScale(2, BigDecimal.ROUND_HALF_EVEN);
System.out.println(roundOff);

1
自Java 9起,BigDecimal.ROUND*已被弃用(详情请见https://docs.oracle.com/javase/9/docs/api/java/math/BigDecimal.html)。 - Det
4
对于Java 9及以上版本,请使用RoundingMode.HALF_EVEN来复制此解决方案。 - Martin Bjeldbak Madsen

14

返回您的代码,将 100 替换为 100.00,然后告诉我它是否有效。 但如果您想更正式些,请尝试以下操作:

import java.text.DecimalFormat;
DecimalFormat df=new DecimalFormat("0.00");
String formate = df.format(value); 
double finalValue = (Double)df.parse(formate) ;

13

我知道这是一个两年前的问题,但每个人在某个时候都会遇到舍入值的问题。我想分享一种不同的方法,可以使用BigDecimal类将值舍入到任何比例。如果我们使用DecimalFormat("0.00")或者使用Math.round(a * 100) / 100,我们可以避免获取最终值所需的额外步骤。

import java.math.BigDecimal;

public class RoundingNumbers {
    public static void main(String args[]){
        double number = 123.13698;
        int decimalsToConsider = 2;
        BigDecimal bigDecimal = new BigDecimal(number);
        BigDecimal roundedWithScale = bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP);
        System.out.println("Rounded value with setting scale = "+roundedWithScale);

        bigDecimal = new BigDecimal(number);
        BigDecimal roundedValueWithDivideLogic = bigDecimal.divide(BigDecimal.ONE,decimalsToConsider,BigDecimal.ROUND_HALF_UP);
        System.out.println("Rounded value with Dividing by one = "+roundedValueWithDivideLogic);

    }
}

这个程序将会给我们以下输出结果

Rounded value with setting scale = 123.14
Rounded value with Dividing by one = 123.14

2
你也可以使用 BigDecimal.ROUND_HALF_EVEN 来实现类似于 Math.round() 的逻辑(1.204 = 1.20,1.205 = 1.21)。 - zoku

13

尝试:

class round{
public static void main(String args[]){

double a = 123.13698;
double roundOff = Math.round(a*100)/100;
String.format("%.3f", roundOff); //%.3f defines decimal precision you want
System.out.println(roundOff);   }}

12
double roundOff = Math.round(a*100)/100;
应该是这样的
double roundOff = Math.round(a*100)/100D;

在100后添加“D”会使其成为双精度字面量,因此产生的结果将具有精度。


1
结果仍然是123.0,不起作用。 - Aayush Mahajan
我现在已经将“F”移动到分母了。现在应该可以工作了。 - Arun
123.13999938964844 的输出更加混乱。 - Aayush Mahajan

7

这是一个长而全面的解决方案,从未失败过

将您的数字作为双精度数传递给此函数,它将返回将小数值四舍五入到最近的5个值;

如果是4.25,则输出4.25

如果是4.20,则输出4.20

如果是4.24,则输出4.20

如果是4.26,则输出4.30

如果您想保留2位小数进行四舍五入,则使用:

DecimalFormat df = new DecimalFormat("#.##");
roundToMultipleOfFive(Double.valueOf(df.format(number)));

如果小数点后最多有3位,则使用 new DecimalFormat("#.###")

如果小数点后最多有n位,则使用 new DecimalFormat("#.nTimes #")

 public double roundToMultipleOfFive(double x)
            {

                x=input.nextDouble();
                String str=String.valueOf(x);
                int pos=0;
                for(int i=0;i<str.length();i++)
                {
                    if(str.charAt(i)=='.')
                    {
                        pos=i;
                        break;
                    }
                }

                int after=Integer.parseInt(str.substring(pos+1,str.length()));
                int Q=after/5;
                int R =after%5;

                if((Q%2)==0)
                {
                    after=after-R;
                }
                else
                {
                   if(5-R==5)
                   {
                     after=after;
                   }
                   else after=after+(5-R);
                }

                       return Double.parseDouble(str.substring(0,pos+1).concat(String.valueOf(after))));

            }

6

看起来你遇到了整数算术问题:在一些语言中,(int)/(int)将总是被评估为整数算术。为了强制使用浮点算术,请确保至少有一个操作数不是整数:

double roundOff = Math.round(a*100)/100.f;

2
有了这个代码 double roundOff = Math.round(a*100F)/100.f;,输出结果更加混乱了。它是:123.13999938964844 - Aayush Mahajan
你是想打印四舍五入后的数字还是对其进行评估(以便进行其他操作)?如果只是打印,那么你应该查阅println的文档。如果你对数字感兴趣,那么我猜测(尚未确认)"混乱"的输出实际上是正确的,因为它是最接近"123.14"的浮点数等价值(请参见此处)。 - umläute
为了以后的参考,将“float”的“f”替换为“double”的“d”应该可以解决您的问题。不确定为什么,但这应该可以解决问题。也许其他人可以详细说明解决方案。 - Barrosy
因为双精度浮点数具有更高的精度,所以“123.14”的双精度等价物显示为“123.14”,而单精度等价物显示为“123.139999”……(顺便说一下,我的OpenJDK 18.0.2安装不会出现这种情况)。 - umläute
这个不起作用,尝试使用19.685,它应该变成19.69。但是它返回的是19.68。 - Abdul Mohsin
它确实有效。值19.685表示为(IEEE-754浮点数)“19.684999465942383”,正确四舍五入为16.68 - umläute

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接