JAVA对double或者float的浮点数精度计算控制方法

  1. package com.soft4j.utility;     
  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.  * @author stephen   
  18.  * @version 1.0.0   
  19.  */    
  20. public final class RoundTool {     
  21.     
  22.     /**   
  23.      * 对double数据进行取精度.   
  24.      * <p>   
  25.      * For example: <br>   
  26.      * double value = 100.345678; <br>   
  27.      * double ret = round(value,4,BigDecimal.ROUND_HALF_UP); <br>   
  28.      * ret为100.3457 <br>   
  29.      *    
  30.      * @param value   
  31.      *            double数据.   
  32.      * @param scale   
  33.      *            精度位数(保留的小数位数).   
  34.      * @param roundingMode   
  35.      *            精度取值方式.   
  36.      * @return 精度计算后的数据.   
  37.      */    
  38.     public static double round(double value, int scale, int roundingMode) {     
  39.         BigDecimal bd = new BigDecimal(value);     
  40.         bd = bd.setScale(scale, roundingMode);     
  41.         double d = bd.doubleValue();     
  42.         bd = null;     
  43.         return d;     
  44.     }     
  45.     
  46.     /**   
  47.      * 测试用的main方法.   
  48.      *    
  49.      * @param argc   
  50.      *            运行参数.   
  51.      */    
  52.     public static void main(String[] argc) {     
  53.         //下面都以保留2位小数为例     
  54.              
  55.         //ROUND_UP     
  56.         //只要第2位后面存在大于0的小数,则第2位就+1     
  57.         System.out.println(round(12.3401,2,BigDecimal.ROUND_UP));//12.35     
  58.         System.out.println(round(-12.3401,2,BigDecimal.ROUND_UP));//-12.35     
  59.         //ROUND_DOWN     
  60.         //与ROUND_UP相反     
  61.         //直接舍弃第2位后面的所有小数     
  62.         System.out.println(round(12.349,2,BigDecimal.ROUND_DOWN));//12.34     
  63.         System.out.println(round(-12.349,2,BigDecimal.ROUND_DOWN));//-12.34     
  64.         //ROUND_CEILING     
  65.         //如果数字>0 则和ROUND_UP作用一样     
  66.         //如果数字<0 则和ROUND_DOWN作用一样     
  67.         System.out.println(round(12.3401,2,BigDecimal.ROUND_CEILING));//12.35     
  68.         System.out.println(round(-12.349,2,BigDecimal.ROUND_CEILING));//-12.34     
  69.         //ROUND_FLOOR     
  70.         //如果数字>0 则和ROUND_DOWN作用一样     
  71.         //如果数字<0 则和ROUND_UP作用一样     
  72.         System.out.println(round(12.349,2,BigDecimal.ROUND_FLOOR));//12.34     
  73.         System.out.println(round(-12.3401,2,BigDecimal.ROUND_FLOOR));//-12.35     
  74.         //ROUND_HALF_UP [这种方法最常用]     
  75.         //如果第3位数字>=5,则第2位数字+1     
  76.         //备注:只看第3位数字的值,不会考虑第3位之后的小数的     
  77.         System.out.println(round(12.345,2,BigDecimal.ROUND_HALF_UP));//12.35     
  78.         System.out.println(round(12.3449,2,BigDecimal.ROUND_HALF_UP));//12.34     
  79.         System.out.println(round(-12.345,2,BigDecimal.ROUND_HALF_UP));//-12.35     
  80.         System.out.println(round(-12.3449,2,BigDecimal.ROUND_HALF_UP));//-12.34     
  81.         //ROUND_HALF_DOWN     
  82.         //如果第3位数字>=5,则做ROUND_UP     
  83.         //如果第3位数字<5,则做ROUND_DOWN     
  84.         System.out.println(round(12.345,2,BigDecimal.ROUND_HALF_DOWN));//12.35     
  85.         System.out.println(round(12.3449,2,BigDecimal.ROUND_HALF_DOWN));//12.34     
  86.         System.out.println(round(-12.345,2,BigDecimal.ROUND_HALF_DOWN));//-12.35     
  87.         System.out.println(round(-12.3449,2,BigDecimal.ROUND_HALF_DOWN));//-12.34     
  88.         //ROUND_HALF_EVEN     
  89.         //如果第3位是偶数,则做ROUND_HALF_DOWN     
  90.         //如果第3位是奇数,则做ROUND_HALF_UP     
  91.         System.out.println(round(12.346,2,BigDecimal.ROUND_HALF_EVEN));//12.35     
  92.         System.out.println(round(12.345,2,BigDecimal.ROUND_HALF_EVEN));//12.35     
  93.     }     
  94. }    

http://rbingfeng.iteye.com/blog/499411


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值