詳解Java中格式化輸出浮點數

在Java中,我們經常使用%f來格式化輸出浮點數,最近發現一個有趣的事。%f可以指定輸出字符的寬度和小數點後的位數
1、只指定了整個輸出的寬度

public static void main(String[] args) {
        double x=0.123456789;
        System.out.printf("%10f",x);
        System.out.printf("\n");
        System.out.printf("%9f",x);
        System.out.printf("\n");
        System.out.printf("%8f",x);
        System.out.printf("\n");
        System.out.printf("%7f",x);
        System.out.printf("\n");
        System.out.printf("%4f",x);
        System.out.printf("\n");
    }

輸出結果是這樣的
這裏寫圖片描述
可以看到,5條記錄的小數點後的位數都是6位,也就是說在不指定小數點後位數的前提下,輸出都是默認的6位
那麼問題來了,%7f 的結果爲什麼是這樣的呢?
7指定輸出的寬度是7個字符,但是顯然,6位的默認小數+小數點+0 所以總共佔了8位,7<8,所以這裏的7設置無效,jvm採用默認輸出,可以看到,只要指定的長度小於8都是無效的,都會採用默認輸出。
如果長度大於8的話,那麼就輸出指定的位數,那麼前面的空格是怎麼算的呢?10%f 代表總共爲10,還是剛纔的算法,10-固定的6位小數-小數點-0=2 所以前面輸出兩個空格。

2、指定輸出的寬度,又指定了小數點後的寬度

public static void main(String[] args) {
        double x=0.123456789;
        System.out.printf("%8.3f",x);
        System.out.printf("\n");
        System.out.printf("%4.3f",x);
        System.out.printf("\n");
        System.out.printf("%4.12f",x);

    }

輸出結果是這樣的
這裏寫圖片描述
輸出先滿足小數點後長度的要求
如果總長度-2>=小數點後長度,那麼總長度設置有效,輸出總長度就是設置的總長度,如 %8.3f
如果總長度-2<小數點後長度,那麼總長度設置無效,輸出總長度爲小數點後長度+2 並且左對齊輸出,如%4.12f

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章