2016-12-27 37 views
0

我正在打印一張矩陣,每個元素的長度都相同,以便於閱讀。Java - 設置要打印的雙倍長度時是否包含小數點和前面的數字?

如果我做這樣的事情:

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,我可能會使用更少的精度,並且每個數字都將是重要的(並且非零)。

+1

可能與[右用零填充]重複(http://stackoverflow.com/questions/12962515/right-pad-with-zeros) – shmosel

+0

但是,如果你指定你想要16位小數,你期望什麼? '%.16f' – ACV

回答

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); 
    

    =>輸出

              1。0000000000000000
            2.3450000000000000
          10.0000000000000000
  1243.5678000000000000

  • 使用Apache共享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)); 
    

    和輸出中:

  • 00001.0000000000000000
    00002.3450000000000000
    00010.0000000000000000
    01243.5678000000000000

    +0

    printf可以以零爲前綴:System.out.printf(「%021.16f%n」,1.0);如果不查找,應該使用至少21位數字打印該號碼。從大多數16後。和5之前。當這個數字在這之前有更多的拒絕。該格式被擴展... – Matthias

    +0

    @Matthias我知道,但我認爲OP對領先的'0'不感興趣(請參閱他在問題中的期望輸出)。無論如何,謝謝你的支持。 – ujulu

    +0

    很難說誰的解決方案更好,但我真的很喜歡你提交的第一個選項的外觀,小數對齊。非常感謝。 – Birrel

    0

    你應該使用BigDecimal。

    事情是這樣的:

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

    你可以閱讀更多關於它here:

    您可以將上面的Double轉換爲String,然後將字符串轉換爲BigDecimal。

    有關更多詳細信息,請參閱此post

    2

    一種選擇是鏈接兩個字符串格式化調用。第一個電話是:

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

    這將給出一個具有16個精度位置的浮點的任意寬度字符串表示形式。如果需要,下一次調用應該給出一個固定寬度的18個字符的字符串,這些字符被截斷。

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