本篇介紹了在JAVA中如何對double或者float的浮點數進行精度計算,在JAVA中提供了多種參數來實現精度的不同控制方式。具體例子如下:
/*<br /> * Created on 2005-6-5<br /> * Author stephen<br /> * Email zhoujianqiang AT gmail DOT com<br /> * CopyRight(C)2005-2008 , All rights reserved.<br /> */<br />package com.soft4j.utility;<br />import java.math.BigDecimal;<br />/**<br /> * 與小數位精度(四捨五入等)相關的一些常用工具方法.<br /> *<br /> * float/double的精度取值方式分為以下幾種: <br><br /> * java.math.BigDecimal.ROUND_UP <br><br /> * java.math.BigDecimal.ROUND_DOWN <br><br /> * java.math.BigDecimal.ROUND_CEILING <br><br /> * java.math.BigDecimal.ROUND_FLOOR <br><br /> * java.math.BigDecimal.ROUND_HALF_UP<br><br /> * java.math.BigDecimal.ROUND_HALF_DOWN <br><br /> * java.math.BigDecimal.ROUND_HALF_EVEN <br><br /> *<br /> * @author stephen<br /> * @version 1.0.0<br /> */<br />public final class RoundTool {<br /> /**<br /> * 對double資料進行取精度.<br /> * <p><br /> * For example: <br><br /> * double value = 100.345678; <br><br /> * double ret = round(value,4,BigDecimal.ROUND_HALF_UP); <br><br /> * ret為100.3457 <br><br /> *<br /> * @param value<br /> * double資料.<br /> * @param scale<br /> * 精度位元(保留的小數位元).<br /> * @param roundingMode<br /> * 精度取值方式.<br /> * @return 精度計算後的資料.<br /> */<br /> public static double round(double value, int scale, int roundingMode) {<br /> BigDecimal bd = new BigDecimal(value);<br /> bd = bd.setScale(scale, roundingMode);<br /> double d = bd.doubleValue();<br /> bd = null;<br /> return d;<br /> }<br /> /**<br /> * 測試用的main方法.<br /> *<br /> * @param argc<br /> * 運行參數.<br /> */<br /> public static void main(String[] argc) {<br /> //下面都以保留2位小數為例</p><p> //ROUND_UP<br /> //只要第2位後面存在大於0的小數,則第2位就+1<br /> System.out.println(round(12.3401,2,BigDecimal.ROUND_UP));//12.35<br /> System.out.println(round(-12.3401,2,BigDecimal.ROUND_UP));//-12.35<br /> //ROUND_DOWN<br /> //與ROUND_UP相反<br /> //直接捨棄第2位後面的所有小數<br /> System.out.println(round(12.349,2,BigDecimal.ROUND_DOWN));//12.34<br /> System.out.println(round(-12.349,2,BigDecimal.ROUND_DOWN));//-12.34<br /> //ROUND_CEILING<br /> //如果數字>0 則和ROUND_UP作用一樣<br /> //如果數字<0 則和ROUND_DOWN作用一樣<br /> System.out.println(round(12.3401,2,BigDecimal.ROUND_CEILING));//12.35<br /> System.out.println(round(-12.349,2,BigDecimal.ROUND_CEILING));//-12.34<br /> //ROUND_FLOOR<br /> //如果數字>0 則和ROUND_DOWN作用一樣<br /> //如果數字<0 則和ROUND_UP作用一樣<br /> System.out.println(round(12.349,2,BigDecimal.ROUND_FLOOR));//12.34<br /> System.out.println(round(-12.3401,2,BigDecimal.ROUND_FLOOR));//-12.35<br /> //ROUND_HALF_UP [這種方法最常用]<br /> //如果第3位元字>=5,則第2位元字+1<br /> //備忘:只看第3位元字的值,不會考慮第3位之後的小數的<br /> System.out.println(round(12.345,2,BigDecimal.ROUND_HALF_UP));//12.35<br /> System.out.println(round(12.3449,2,BigDecimal.ROUND_HALF_UP));//12.34<br /> System.out.println(round(-12.345,2,BigDecimal.ROUND_HALF_UP));//-12.35<br /> System.out.println(round(-12.3449,2,BigDecimal.ROUND_HALF_UP));//-12.34<br /> //ROUND_HALF_DOWN<br /> //如果第3位元字>=5,則做ROUND_UP<br /> //如果第3位元字<5,則做ROUND_DOWN<br /> System.out.println(round(12.345,2,BigDecimal.ROUND_HALF_DOWN));//12.35<br /> System.out.println(round(12.3449,2,BigDecimal.ROUND_HALF_DOWN));//12.34<br /> System.out.println(round(-12.345,2,BigDecimal.ROUND_HALF_DOWN));//-12.35<br /> System.out.println(round(-12.3449,2,BigDecimal.ROUND_HALF_DOWN));//-12.34<br /> //ROUND_HALF_EVEN<br /> //如果第3位是偶數,則做ROUND_HALF_DOWN<br /> //如果第3位是奇數,則做ROUND_HALF_UP<br /> System.out.println(round(12.346,2,BigDecimal.ROUND_HALF_EVEN));//12.35<br /> System.out.println(round(12.345,2,BigDecimal.ROUND_HALF_EVEN));//12.35<br /> }<br />}<br />