Java-设置要打印的双精度长度时,是否包括小数和前面的数字?

Java-设置要打印的双精度长度时,是否包括小数和前面的数字?,java,printf,double,Java,Printf,Double,我打印出一个矩阵,每个元素在屏幕上都有相同的长度,以便阅读 如果我这样做: System.out.printf("%.16f", x); 然后根据前面的(全部)值,我得到不同的长度: 提供以下输出: // 1.0000000000000000 // 2.3450000000000000 // 10.0000000000000000 // 1243.5678000000000000 这让矩阵变得一团糟。如何将整个double(包括小数和整数)限制在一定的长度?因此,对于之前的案例,输出将是:

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

如果我这样做:

System.out.printf("%.16f", x);
然后根据前面的(全部)值,我得到不同的长度:

提供以下输出:

// 1.0000000000000000
// 2.3450000000000000
// 10.0000000000000000
// 1243.5678000000000000
这让矩阵变得一团糟。如何将整个double(包括小数和整数)限制在一定的长度?因此,对于之前的案例,输出将是:

// 1.0000000000000000
// 2.3450000000000000
// 10.000000000000000
// 1243.5678000000000
编辑#1


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

你应该使用BigDecimal

大概是这样的:

BigDecimal db = new BigDecimal(d).setScale(6, BigDecimal.ROUND_HALF_UP);
你可以阅读更多关于它的内容

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


有关详细信息,请阅读本手册。

您应该使用BigDecimal

大概是这样的:

BigDecimal db = new BigDecimal(d).setScale(6, BigDecimal.ROUND_HALF_UP);
你可以阅读更多关于它的内容

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


您可以阅读本文了解更多详细信息。

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

String.format("%.16f", x)
这将给出浮点的任意宽度字符串表示,精度为16位。下一个调用应该给出一个18个字符的固定宽度字符串,如果需要,该字符串将被右截断

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

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

String.format("%.16f", x)
这将给出浮点的任意宽度字符串表示,精度为16位。下一个调用应该给出一个18个字符的固定宽度字符串,如果需要,该字符串将被右截断

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

有不同的方式格式化输出(但与您的输出不完全相同):

  • 使用
    printf
    方法(假设21位宽度):

    =>输出

  • 1.0000000000000000
    2.3450000000000000
    10.0000000000000000
    124356780000000000000

  • 使用ApacheCommonsLang库。假设您希望小数点后有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'));
    
  • 输出:

    1.0000000000000000000
    2.3450000000000000000
    10.000000000000000000000000
    124356780000000000000

  • 另一种方法是使用
    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));
    
    以及输出:

  • 00001.0000000000000000
    00002.3450000000000000
    00010.0000000000000000
    01243.567800000000000


    有不同的方式格式化输出(但与您的输出不完全相同):

  • 使用
    printf
    方法(假设21位宽度):

    =>输出

  • 1.0000000000000000
    2.3450000000000000
    10.0000000000000000
    124356780000000000000

  • 使用ApacheCommonsLang库。假设您希望小数点后有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'));
    
  • 输出:

    1.0000000000000000000
    2.3450000000000000000
    10.000000000000000000000000
    124356780000000000000

  • 另一种方法是使用
    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));
    
    以及输出:

  • 00001.0000000000000000
    00002.3450000000000000
    00010.0000000000000000
    01243.567800000000000


    可能重复,但如果指定需要16位小数,您希望得到什么<代码>%.16f的可能重复,但如果指定需要16位小数,您希望得到什么
    %.16f
    Printf可以前缀为零:System.out.Printf(“%021.16f%n”,1.0);在不查找的情况下,应使用至少21位数字打印数字。从最多的16人开始,他们都是追求成功的人。和5之前。当数字在前有更多degits时。格式扩展了…@Matthias我知道,但我认为OP对领先的
    0
    s不感兴趣(参见问题中他想要的输出)。无论如何,谢谢你的建议。很难说谁的解决方案更好,但我真的很喜欢你提出的第一个选项的外观,小数对齐。非常感谢。Printf可以前缀为零:System.out.Printf(“%021.16f%n”,1.0);在不查找的情况下,应使用至少21位数字打印数字。从最多的16人开始,他们都是追求成功的人。和5之前。当数字在前有更多degits时。格式扩展了…@Matthias我知道,但我认为OP对领先的
    0
    s不感兴趣(参见问题中他想要的输出)。无论如何,谢谢你的建议。很难说谁的解决方案更好,但我真的很喜欢你提出的第一个选项的外观,小数对齐。非常感谢。