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位宽度):
=>输出2.3450000000000000
10.0000000000000000
124356780000000000000
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.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));
以及输出:00002.3450000000000000
00010.0000000000000000
01243.567800000000000
有不同的方式格式化输出(但与您的输出不完全相同):
printf
方法(假设21位宽度):
=>输出2.3450000000000000
10.0000000000000000
124356780000000000000
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.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));
以及输出: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不感兴趣(参见问题中他想要的输出)。无论如何,谢谢你的建议。很难说谁的解决方案更好,但我真的很喜欢你提出的第一个选项的外观,小数对齐。非常感谢。