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 }