• 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

  • 相关阅读:
    纯CSS实现的很酷的卡通肖像和眨眼动效
    RMQ(区间求最值)
    CentOS---网络配置具体解释
    breakpoints && lldb  && chisel 的使用
    c语言单链表实现
    hdu1595 find the longest of the shortest(Dijkstra)
    POJ 3254 Corn Fields 状态压缩
    我多希望我学编程时,有人教我这些事!
    tts和字符集的关系--要求源和目的端的数据库字符集必须一样,国家字符集必须一样。
    [读后感]编程能力与编程年龄
  • 原文地址:https://www.cnblogs.com/longlyseul/p/11577831.html
Copyright © 2020-2023  润新知