小编典典

将 double 舍入到小数点后 2 位

all

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


阅读 123

收藏
2022-03-08

共1个答案

小编典典

这是一个将 double 入(而不是 截断 )到指定小数位数的实用程序。

例如:

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)

多年来,我一直在使用上述方法将“不太大”的双精度数舍入到小数点后 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
文档
,如果您怀疑您需要其他东西,例如银行家的四舍五入

当然,如果您愿意,您可以将上述内容内联到一个单行中:
new BigDecimal(value).setScale(places, 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")));

关于该主题的一些出色的进一步阅读:


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

具体来说,请注意round(200, 0)返回200.0. 如果你想输出“ 200.00”,你应该先四舍五入然后格式化输出结果

2022-03-08