如果值为200.3456,则应该将其格式化为200.34。 如果它是200,那么它应该是200.00。


当前回答

如果你只是想打印小数点后有两位数字的double,可以使用这样的方法:

double value = 200.3456;
System.out.printf("Value: %.2f", value);

如果你想将结果以String形式显示,而不是输出到控制台,请使用String.format(),并使用相同的参数:

String result = String.format("%.2f", value);

或者使用类DecimalFormat:

DecimalFormat df = new DecimalFormat("####0.00");
System.out.println("Value: " + df.format(value));

其他回答

value = (int)(value * 100 + 0.5) / 100.0;

下面是一个实用程序,它将双精度数舍入(而不是截断)到指定的小数点后数位。

例如:

round(200.3456, 2); // returns 200.35

原始版本;注意这个

public static double round(double value, int places) {
    if (places < 0) throw new IllegalArgumentException();

    long factor = (long) Math.pow(10, places);
    value = value * factor;
    long tmp = Math.round(value);
    return (double) tmp / factor;
}

在小数位数非常多的情况下(例如,round(1000.0d, 17))或大整数部分(例如,round(90080070060.1d, 9)),这种情况会严重失败。感谢Sloin指出这一点。

多年来,我一直在愉快地使用上述方法将“不太大”的双数四舍五入到小数点后2或3位(例如,为了记录日志,以秒为单位清理时间:27.987654321987 -> 27.99)。但我想最好还是避免它,因为有更可靠的方法,代码也更干净。

所以,用这个代替

(改编自路易斯·沃瑟曼的回答和肖恩·欧文的回答。)

public static double round(double value, int places) {
    if (places < 0) throw new IllegalArgumentException();

    BigDecimal bd = BigDecimal.valueOf(value);
    bd = bd.setScale(places, RoundingMode.HALF_UP);
    return bd.doubleValue();
}

注意HALF_UP是“学校常用的”舍入模式。仔细阅读RoundingMode文档,如果你怀疑你需要其他的东西,比如Bankers '舍入。

当然,如果你愿意,你可以把上面的代码内联到一行代码中: 新BigDecimal(值)。setScale(地方,RoundingMode.HALF_UP) .doubleValue ()

在每种情况下

永远记住,使用float和double的浮点表示是不精确的。 例如,考虑这些表达式:

999199.1231231235 == 999199.1231231236 // true
1.03 - 0.41 // 0.6200000000000001

为了精确起见,您需要使用BigDecimal。在此过程中,使用接受String的构造函数,而不是接受double的构造函数。例如,尝试执行以下命令:

System.out.println(new BigDecimal(1.03).subtract(new BigDecimal(0.41)));
System.out.println(new BigDecimal("1.03").subtract(new BigDecimal("0.41")));

关于这个主题的一些优秀的进一步阅读:

第48条:Joshua Bloch在Effective Java(第二版)中的“如果需要精确的答案,避免使用float和double” 关于浮点运算,每个程序员都应该知道的


如果您想要字符串格式,而不是(或除了)严格舍入数字,请参阅其他答案。

具体来说,请注意轮(200,0)返回200.0。如果您想输出“200.00”,您应该首先四舍五入,然后格式化输出结果(这在Jesper的回答中得到了完美的解释)。

function Double round2(Double val) {
    return new BigDecimal(val.toString()).setScale(2,RoundingMode.HALF_UP).doubleValue();
}

注意toString()!!!!

这是因为BigDecimal转换double的精确二进制形式!!

这些是各种建议的方法及其失败的情况。

// Always Good!
new BigDecimal(val.toString()).setScale(2,RoundingMode.HALF_UP).doubleValue() 

Double val = 260.775d; //EXPECTED 260.78
260.77 - WRONG - new BigDecimal(val).setScale(2,RoundingMode.HALF_UP).doubleValue()

Double val = 260.775d; //EXPECTED 260.78
260.77 - TRY AGAIN - Math.round(val * 100.d) / 100.0d  

Double val = 256.025d; //EXPECTED 256.03d
256.02 - OOPS - new DecimalFormat("0.00").format(val) 
// By default use half even, works if you change mode to half_up 

Double val = 256.025d; //EXPECTED 256.03d
256.02 - FAIL - (int)(val * 100 + 0.5) / 100.0;

对于两个四舍五入数字。非常简单,你基本上是更新变量,而不是只是显示的目的,DecimalFormat。

x =数学。地板(x * 100) / 100;

double value= 200.3456;
DecimalFormat df = new DecimalFormat("0.00");      
System.out.println(df.format(value));