• Java 中的浮点数取精度方法


    Java 中的浮点数取精度方法

    一、内容

      一般在Java代码中取一个double类型的浮点数的精度,四舍五入或者直接舍去等的方式,使用了4种方法,推荐使用第一种,我已经封装成工具类了。

    二、代码实现

       ①使用BigDecimal的方法:RoundTool.java(封装为工具类,推荐使用)

      1 package cn.com.cxsw.utils;
      2 
      3 import java.math.BigDecimal;
      4 
      5 /**
      6  * 与小数位精度(四舍五入等)相关的一些常用工具方法.
      7  * 
      8  * float/double的精度取值方式分为以下几种: <br>
      9  * java.math.BigDecimal.ROUND_UP <br>
     10  * java.math.BigDecimal.ROUND_DOWN <br>
     11  * java.math.BigDecimal.ROUND_CEILING <br>
     12  * java.math.BigDecimal.ROUND_FLOOR <br>
     13  * java.math.BigDecimal.ROUND_HALF_UP<br>
     14  * java.math.BigDecimal.ROUND_HALF_DOWN <br>
     15  * java.math.BigDecimal.ROUND_HALF_EVEN <br>
     16  * 
     17  * @title RoundTool
     18  * @describe
     19  * @author zfc
     20  * @date 2017年10月25日上午11:18:47
     21  */
     22 
     23 public final class RoundTool {
     24     /**
     25      * 对double数据进行取精度.
     26      * <p>
     27      * For example: <br>
     28      * double value = 100.345678; <br>
     29      * double ret = round(value,4,BigDecimal.ROUND_HALF_UP); <br>
     30      * ret为100.3457 <br>
     31      * 
     32      * @param value
     33      *            double数据.
     34      * @param scale
     35      *            精度位数(保留的小数位数).
     36      * @param roundingMode
     37      *            精度取值方式.
     38      * @return 精度计算后的数据.
     39      */
     40     public static double round(double value, int scale, int roundingMode) {
     41         BigDecimal bd = new BigDecimal(value);
     42         bd = bd.setScale(scale, roundingMode);
     43         double d = bd.doubleValue();
     44         bd = null;
     45         return d;
     46     }
     47 
     48     /**
     49      * 测试用的main方法.
     50      * 
     51      * @param argc
     52      *            运行参数.
     53      * 
     54      */
     55     public static void main(String[] argc) {
     56         // 下面都以保留2位小数为例
     57 
     58         // ROUND_UP
     59         // 只要第2位后面存在大于0的小数,则第2位就+1
     60         System.out.println(round(12.3401, 2, BigDecimal.ROUND_UP));// 12.35
     61         System.out.println(round(-12.3401, 2, BigDecimal.ROUND_UP));// -12.35
     62 
     63         // ROUND_DOWN
     64         // 与ROUND_UP相反
     65         // 直接舍弃第2位后面的所有小数
     66         System.out.println(round(12.349, 2, BigDecimal.ROUND_DOWN));// 12.34
     67         System.out.println(round(-12.349, 2, BigDecimal.ROUND_DOWN));// -12.34
     68 
     69         // ROUND_CEILING
     70         // 如果数字>0 则和ROUND_UP作用一样
     71         // 如果数字<0 则和ROUND_DOWN作用一样
     72         System.out.println(round(12.3401, 2, BigDecimal.ROUND_CEILING));// 12.35
     73         System.out.println(round(-12.349, 2, BigDecimal.ROUND_CEILING));// -12.34
     74 
     75         // ROUND_FLOOR
     76         // 如果数字>0 则和ROUND_DOWN作用一样
     77         // 如果数字<0 则和ROUND_UP作用一样
     78         System.out.println(round(12.349, 2, BigDecimal.ROUND_FLOOR));// 12.34
     79         System.out.println(round(-12.3401, 2, BigDecimal.ROUND_FLOOR));// -12.35
     80 
     81         // ROUND_HALF_UP [这种方法最常用,四舍五入]
     82         // 如果第3位数字>=5,则第2位数字+1
     83         // 备注:只看第3位数字的值,不会考虑第3位之后的小数的
     84         System.out.println(round(12.345, 2, BigDecimal.ROUND_HALF_UP));// 12.35
     85         System.out.println(round(12.3449, 2, BigDecimal.ROUND_HALF_UP));// 12.34
     86         System.out.println(round(-12.345, 2, BigDecimal.ROUND_HALF_UP));// -12.35
     87         System.out.println(round(-12.3449, 2, BigDecimal.ROUND_HALF_UP));// -12.34
     88 
     89         // ROUND_HALF_DOWN
     90         // 如果第3位数字>=5,则做ROUND_UP
     91         // 如果第3位数字<5,则做ROUND_DOWN
     92         System.out.println(round(12.345, 2, BigDecimal.ROUND_HALF_DOWN));// 12.35
     93         System.out.println(round(12.3449, 2, BigDecimal.ROUND_HALF_DOWN));// 12.34
     94         System.out.println(round(-12.345, 2, BigDecimal.ROUND_HALF_DOWN));// -12.35
     95         System.out.println(round(-12.3449, 2, BigDecimal.ROUND_HALF_DOWN));// -12.34
     96 
     97         // ROUND_HALF_EVEN
     98         // 如果第3位是偶数,则做ROUND_HALF_DOWN
     99         // 如果第3位是奇数,则做ROUND_HALF_UP
    100         System.out.println(round(12.346, 2, BigDecimal.ROUND_HALF_EVEN));// 12.35
    101         System.out.println(round(12.345, 2, BigDecimal.ROUND_HALF_EVEN));// 12.35
    102 
    103     }
    104 
    105 }

     ②一些简单的方法:DoubleNumberFormat.java

     1 package cn.com.zfc.example;
     2 
     3 import java.text.DecimalFormat;
     4 import java.text.NumberFormat;
     5 
     6 /**
     7  * double类型的浮点数取精度(以保留两位小数为例)
     8  * 
     9  * @author zfc
    10  *
    11  */
    12 public class DoubleNumberFormat {
    13     public static void main(String[] args) {
    14         double num = 1234.123534;
    15         // 1、使用String的format()方法
    16         System.out.println(num + " 保留两位小数:" + String.format("%.2f", num));
    17 
    18         // 2、使用DecimalFormat的format()方法
    19         DecimalFormat decimalFormat = new DecimalFormat("#.00");
    20         System.out.println(num + " 保留两位小数:" + decimalFormat.format(num));
    21 
    22         // 3、使用NumberFormat的format()方法
    23         NumberFormat numberFormat = NumberFormat.getNumberInstance();
    24         numberFormat.setMaximumFractionDigits(2);
    25         System.out.println(num + " 保留两位小数:" + numberFormat.format(num));
    26     }
    27 }
  • 相关阅读:
    全面了解Cookie
    HTML5实现无刷新修改URL
    闭包的理解
    JS中的prototype、__proto__与constructor
    Array.prototype.slice.call()方法详解
    深入理解 Array.prototype.map()
    网页布局——Flex弹性框布局
    vue项目的各个文件作用
    node使用心得
    node连接Mysql报错ER_NOT_SUPPORTED_AUTH_MODE
  • 原文地址:https://www.cnblogs.com/zfc-java/p/7728043.html
Copyright © 2020-2023  润新知