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