Java - 设置要打印的double的长度时包括小数和前几位数?

时间:2016-12-27 07:05:30

标签: java printf double

我正在打印一个矩阵,每个元素都有相同的长度打印在屏幕上,以便于阅读。

如果我这样做:

System.out.printf("%.16f", x);

然后我得到不同的长度,取决于前面的(整个)值:

x = 1;
x = 2.345;
x = 10;
x = 1243.5678;

给出以下输出:

// 1.0000000000000000
// 2.3450000000000000
// 10.0000000000000000
// 1243.5678000000000000

这使矩阵变得凌乱。如何将整个双精度(包括小数和整数)限制为一定长度?因此,对于以前的情况,输出将是:

// 1.0000000000000000
// 2.3450000000000000
// 10.000000000000000
// 1243.5678000000000

编辑#1

我不想只用零填充。前导零没有吸引力,可能会导致误读。即使我现在有%.16f,我可能会使用较少的精度,每个数字都会很重要(并且非零)。

3 个答案:

答案 0 :(得分:2)

一个选项是链接两个字符串格式化调用。第一个电话是:

String.format("%.16f", x)

这将给出具有16个精度位置的浮点的任意宽度字符串表示。下一个调用应该给出一个18个字符的固定宽度字符串,如果需要,它会被截断。

System.out.format("%18s : %s", String.format("%.16f", x));

答案 1 :(得分:2)

格式化输出的方式有多种(但与输出的格式不同):

  1. 使用printf方法(假设宽度为21位):

    System.out.printf("%21.16f%n", 1.0);
    System.out.printf("%21.16f%n", 2.345);
    System.out.printf("%21.16f%n", 10.0);
    System.out.printf("%21.16f", 1243.5678);
    

    =>输出

  2.   

    1.0000000000000000
      2.3450000000000000
      10.0000000000000000
      1243.5678000000000000

    1. 使用Apache Commons Lang库。假设您希望在小数点后面有16位数字,在它之前有5位数字,则可能会产生以下结果:

      System.out.println(StringUtils.rightPad(String.valueOf(1.0), 21, '0'));
      System.out.println(StringUtils.rightPad(String.valueOf(2.345), 21, '0'));
      System.out.println(StringUtils.rightPad(String.valueOf(10.0), 21, '0'));
      System.out.println(StringUtils.rightPad(String.valueOf(1243.5678), 21, '0'));
      
    2. 输出:

        

      1.0000000000000000000
        2.3450000000000000000
        10.000000000000000000
        1243.5678000000000000

      1. 另一种方法是使用DecimalFormat

        final String format = "00000.0000000000000000";
        DecimalFormat formatter = new DecimalFormat(format);
        System.out.println(formatter.format(1.0));
        System.out.println(formatter.format(2.345));
        System.out.println(formatter.format(10.0));
        System.out.println(formatter.format(1243.5678));
        

        和ouput:

      2.   

        00001.0000000000000000
          00002.3450000000000000
          00010.0000000000000000
          01243.5678000000000000

答案 2 :(得分:0)

你应该使用BigDecimal。

这样的事情:

BigDecimal db = new BigDecimal(d).setScale(6, BigDecimal.ROUND_HALF_UP);

您可以详细了解here:

您可以将上述Double转换为String,然后将字符串转换为BigDecimal。

您可以阅读此post了解详情。