如何在Java中将数字四舍五入到小数点后n位

时间:2020-03-06 14:55:51  来源:igfitidea点击:

我想要的是一种将双精度型转换为字符串的方法,该字符串使用half-up方法进行四舍五入,即,如果要舍入的小数为5,则始终将其舍入为前一个数字。这是大多数人在大多数情况下期望的四舍五入标准方法。

我还希望只显示有效数字,即不应有任何尾随零。

我知道这样做的一种方法是使用String.format方法:

String.format("%.5g%n", 0.912385);

返回:

0.91239

很好,但是即使数字不重要,它也始终显示小数点后5位的数字:

String.format("%.5g%n", 0.912300);

返回:

0.91230

另一种方法是使用DecimalFormatter

DecimalFormat df = new DecimalFormat("#.#####");
df.format(0.912385);

返回:

0.91238

但是,如我们所见,这使用了半数舍入。如果前一位是偶数,它将四舍五入。我想要的是这样的:

0.912385 -> 0.91239
0.912300 -> 0.9123

用Java实现此目标的最佳方法是什么?

解决方案

假设"值"是"双",则可以执行以下操作:

(double)Math.round(value * 100000d) / 100000d

这是5位数字的精度。零数表示小数位数。

double myNum = .912385;
int precision = 10000; //keep 4 digits
myNum= Math.floor(myNum * precision +.5)/precision;

使用setRoundingMode,显式设置RoundingMode以处理半个半个回合的问题,然后将格式模式用于所需的输出。

例子:

DecimalFormat df = new DecimalFormat("#.####");
df.setRoundingMode(RoundingMode.CEILING);
for (Number n : Arrays.asList(12, 123.12345, 0.23, 0.1, 2341234.212431324)) {
    Double d = n.doubleValue();
    System.out.println(df.format(d));
}

给出输出:

12
123.1235
0.23
0.1
2341234.2125

我们也可以使用

DecimalFormat df = new DecimalFormat("#.00000");
df.format(0.912385);

确保我们具有尾随的0。

new BigDecimal(String.valueOf(double)).setScale(yourScale, BigDecimal.ROUND_HALF_UP);

会给你一个BigDecimal。要从中获取字符串,只需调用BigDecimal的toString方法或者Java 5+的toPlainString方法以获取纯格式字符串即可。

样例程序:

package trials;
import java.math.BigDecimal;

public class Trials {

    public static void main(String[] args) {
        int yourScale = 10;
        System.out.println(BigDecimal.valueOf(0.42344534534553453453-0.42324534524553453453).setScale(yourScale, BigDecimal.ROUND_HALF_UP));
    }

Real的Java How-to发布了该解决方案,该解决方案也与Java 1.6之前的版本兼容。

BigDecimal bd = new BigDecimal(Double.toString(d));
bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP);
return bd.doubleValue();