Java 浮點數精度控制


1、String.format​(String format,Object… args)
Java中用String.format()來控制輸出精度,
format參數用來設置精度格式,
args參數代表待格式化的數字。
返回值是格式化后的字符串。
Java API文檔中的解釋是這樣的:

 

 文檔不好懂… 
沒關系 
直接上代碼!

//精確到小數點后兩位:
public class test {
    public static void main(String args[])
    {
        //格式控制與C語言類似
        System.out.println(String.format("%.2f", Math.PI));
    }

}
//結果
3.14

這種方法,在處理單個數據比較方便,如果要對大量數字進行格式化控制,這種方法就顯得有些冗余。 
下面這個方法比較適合批量處理數據,即:一次設定格式,一直使用該格式。

2、DecimalFormat類,用以定制小數格式

先上代碼,如果不懂‘#’和‘0’代表什么意思,直接略過代碼,去看后面的內容。了解之后再返回來看代碼。

public class test {
    public static void main(String args[])
    {
//      System.out.println(String.format("%.2f", Math.PI));
        double pi = 3.142;
        //僅取整數部分
        System.out.println(new DecimalFormat("0").format(pi));//3
        System.out.println(new DecimalFormat("#").format(pi));//3
        //取小數點后兩位
        System.out.println(new DecimalFormat("0.00").format(pi));//3.14
        //取小數點后兩位,整數部分取兩位,不足前面補零
        System.out.println(new DecimalFormat("00.00").format(pi));//03.14
        //取小數點后4位,不足補零
        System.out.println(new DecimalFormat("0.0000").format(pi));//3.1420
        //以百分比方式計數並小數點后2位
        System.out.println(new DecimalFormat("0.00%").format(pi));//314.20%

        long l = 123456789;
        //科學計數法,取5位小數
        System.out.println(new DecimalFormat("0.00000E0").format(l));//1.23457E8
        //顯示為兩位整數,並保留小數點后四位的科學計數法
        System.out.println(new DecimalFormat("00.0000E0").format(l));//12.3457E7
        //每三位以逗號分隔
        System.out.println(new DecimalFormat(",000").format(l));//123,456,789
        //嵌入格式文本
        System.out.println(new DecimalFormat("這個長整數為:0").format(l));//這個長整數為:123456789
    }

}

看了這么半天“#”和“0”,那么這兩個有什么區別呢?先別急,等我慢慢解釋。 
先放兩張截圖自己揣摩一下(看不懂繼續往后翻): 

 

 

 

這兩張圖片內容類似,但互為補充。

接下來着重解釋一下“0”和“#”。這是精度控制的核心所在。

0:0總是顯示出來,如果不足以0補足,如果多余則精確度為0的個數。

例如:

pi = 3.142
System.out.println(new DecimalFormat("0.00").format(pi));
//結果
3.14

小數點后兩個0,代表精確到小數點后兩位 
例如:

 

pi = 3.142
System.out.println(new DecimalFormat("0.0000").format(pi));
//結果
3.1420

  

原本要精確到小數點后四位,但是小數點后不足四位,所以用0代替
一般情況下的精確度控制僅用0表示足夠了。
那么“#”代表什么意思呢?

#:總是省略引導0
“#”和“0”都可以控制精度,但是當“#”所在的位置為0時,就會忽略掉這個0。忽略掉的這個0不影響結果的大小。
舉個例子

public static final DecimalFormat df1 = new DecimalFormat( "#.##" );
public static final DecimalFormat df2 = new DecimalFormat( "#.00" );

System.out.println(df1.format(7.80));//8后面的0被忽略
System.out.println(df1.format(85));//不會在后面補0
System.out.println(df1.format(85.786));//正常顯示精度,因為后面沒有出現0
System.out.println(df1.format(85.796));//根據四舍五入,后面的0被忽略

System.out.println(df2.format(7.80));
System.out.println(df2.format(85));
System.out.println(df2.format(85.786));
//結果
7.8
85
85.79
85.8

7.80
85.00
85.79 

也就是說,使用#號來控制精度,可能起不到控制精度的效果。

因此建議,始終用0來控制精度。

 

參考:
http://tutorials.jenkov.com/java-internationalization/decimalformat.html
https://blog.csdn.net/thunder4393/article/details/1739911
https://www.cnblogs.com/hq233/p/6539107.html
https://stackoverflow.com/questions/16583604/formatting-numbers-using-decimalformat

————————————————
版權聲明:本文為CSDN博主「Medlen」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_38481963/article/details/82120870


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM