Java 中的浮点数取精度方法

Posted 勇闯天涯zfc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于Java 中的浮点数取精度方法的主要内容,如果未能解决你的问题,请参考以下文章

35Java 中的 Math 类Random 随机数UUID格式化字符串或数字字符串和数字的相互转换高精度计算BigDecimal计算机中的浮点数都是近似值

floatdouble的精度范围,在内存中的存储方式

用decimal模块增加python的浮点数精度

输出保留12位小数的浮点数

将结构与 rust 中的浮点数进行比较

当我需要存储不同精度的浮点数时,如何定义 HTML 输入字段?