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计算机中的浮点数都是近似值