我正在打印一个矩阵,每个元素都有相同的长度打印在屏幕上,以便于阅读。
如果我这样做:
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
,我可能会使用较少的精度,每个数字都会很重要(并且非零)。
答案 0 :(得分:2)
一个选项是链接两个字符串格式化调用。第一个电话是:
String.format("%.16f", x)
这将给出具有16个精度位置的浮点的任意宽度字符串表示。下一个调用应该给出一个18个字符的固定宽度字符串,如果需要,它会被截断。
System.out.format("%18s : %s", String.format("%.16f", x));
答案 1 :(得分:2)
格式化输出的方式有多种(但与输出的格式不同):
使用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);
=>输出
1.0000000000000000
2.3450000000000000
10.0000000000000000
1243.5678000000000000
使用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'));
输出:
1.0000000000000000000
2.3450000000000000000
10.000000000000000000
1243.5678000000000000
另一种方法是使用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:
00001.0000000000000000
00002.3450000000000000
00010.0000000000000000
01243.5678000000000000
答案 2 :(得分:0)