详解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

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