zoukankan      html  css  js  c++  java
  • BigDecimal 准确的 double , float 计算

    public class ArithUtil {
        private static final int DEF_DIV_SCALE = 10;
    
        private ArithUtil() {
        }
    
        /**
         * 提供精确的加法运算。
         * 
         * @param v1
         *            被加数
         * @param v2
         *            加数
         * @return 两个参数的和
         */
        public static double add(double v1, double v2) {
            BigDecimal b1 = new BigDecimal(Double.toString(v1));
            BigDecimal b2 = new BigDecimal(Double.toString(v2));
            return b1.add(b2).doubleValue();
        }
    
        /**
         * 提供精确的减法运算。
         * 
         * @param v1
         *            被减数
         * @param v2
         *            减数
         * @return 两个参数的差
         */
        public static double sub(double v1, double v2) {
            BigDecimal b1 = new BigDecimal(Double.toString(v1));
            BigDecimal b2 = new BigDecimal(Double.toString(v2));
            return b1.subtract(b2).doubleValue();
        }
    
        /**
         * 提供精确的乘法运算。
         * 
         * @param v1
         *            被乘数
         * @param v2
         *            乘数
         * @return 两个参数的积
         */
        public static double mul(double v1, double v2) {
            BigDecimal b1 = new BigDecimal(Double.toString(v1));
            BigDecimal b2 = new BigDecimal(Double.toString(v2));
            return b1.multiply(b2).doubleValue();
        }
    
        /**
         * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 小数点以后10位,以后的数字四舍五入。
         * 
         * @param v1
         *            被除数
         * @param v2
         *            除数
         * @return 两个参数的商
         */
        public static double div(double v1, double v2) {
            return div(v1, v2, DEF_DIV_SCALE);
        }
    
        /**
         * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入。
         * 
         * @param v1
         *            被除数
         * @param v2
         *            除数
         * @param scale
         *            表示表示需要精确到小数点以后几位。
         * @return 两个参数的商
         */
        public static double div(double v1, double v2, int scale) {
            if (scale < 0) {
                throw new IllegalArgumentException("The scale must be a positive integer or zero");
            }
            BigDecimal b1 = new BigDecimal(Double.toString(v1));
            BigDecimal b2 = new BigDecimal(Double.toString(v2));
            return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
        }
    
        /**
         * 提供精确的小数位四舍五入处理。
         * 
         * @param v
         *            需要四舍五入的数字
         * @param scale
         *            小数点后保留几位
         * @return 四舍五入后的结果
         */
        public static double round(double v, int scale) {
            if (scale < 0) {
                throw new IllegalArgumentException("The scale must be a positive integer or zero");
            }
            BigDecimal b = new BigDecimal(Double.toString(v));
            BigDecimal one = new BigDecimal("1");
            return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
        }
    1. /**  
    2. * 提供精确的加法运算。  
    3. * @param v1 被加数  
    4. * @param v2 加数  
    5. * @return 两个参数的和  
    6. */  
    7. public static double add(double v1,double v2){   
    8. BigDecimal b1 = new BigDecimal(Double.toString(v1));   
    9. BigDecimal b2 = new BigDecimal(Double.toString(v2));   
    10. return b1.add(b2).doubleValue();   
    11. }   
    12. /**  
    13. * 提供精确的减法运算。  
    14. * @param v1 被减数  
    15. * @param v2 减数  
    16. * @return 两个参数的差  
    17. */  
    18. public static double sub(double v1,double v2){   
    19. BigDecimal b1 = new BigDecimal(Double.toString(v1));   
    20. BigDecimal b2 = new BigDecimal(Double.toString(v2));   
    21. return b1.subtract(b2).doubleValue();   
    22. }   
    23. /**  
    24. * 提供精确的乘法运算。  
    25. * @param v1 被乘数  
    26. * @param v2 乘数  
    27. * @return 两个参数的积  
    28. */  
    29. public static double mul(double v1,double v2){   
    30. BigDecimal b1 = new BigDecimal(Double.toString(v1));   
    31. BigDecimal b2 = new BigDecimal(Double.toString(v2));   
    32. return b1.multiply(b2).doubleValue();   
    33. }   
    34. /**  
    35. * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到  
    36. * 小数点以后10位,以后的数字四舍五入。  
    37. * @param v1 被除数  
    38. * @param v2 除数  
    39. * @return 两个参数的商  
    40. */  
    41. public static double div(double v1,double v2){   
    42. return div(v1,v2,DEF_DIV_SCALE);   
    43. }   
    44. /**  
    45. * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指  
    46. * 定精度,以后的数字四舍五入。  
    47. * @param v1 被除数  
    48. * @param v2 除数  
    49. * @param scale 表示表示需要精确到小数点以后几位。  
    50. * @return 两个参数的商  
    51. */  
    52. public static double div(double v1,double v2,int scale){   
    53. if(scale<0){   
    54. throw new IllegalArgumentException(   
    55. "The scale must be a positive integer or zero");   
    56. }   
    57. BigDecimal b1 = new BigDecimal(Double.toString(v1));   
    58. BigDecimal b2 = new BigDecimal(Double.toString(v2));   
    59. return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();   
    60. }   
    61. /**  
    62. * 提供精确的小数位四舍五入处理。  
    63. * @param v 需要四舍五入的数字  
    64. * @param scale 小数点后保留几位  
    65. * @return 四舍五入后的结果  
    66. */  
    67. public static double round(double v,int scale){   
    68. if(scale<0){   
    69. throw new IllegalArgumentException("The scale must be a positive integer or zero");   
    70. }   
    71. BigDecimal b = new BigDecimal(Double.toString(v));   
    72. BigDecimal one = new BigDecimal("1");   
    73. return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();   
    74. }   
  • 相关阅读:
    《3S新闻周刊》No.8:导航迈入井喷时代
    ESRI的Blog正式开始更新
    Google Earth中国部分数据重大更新
    说说EverNote
    选择ESRI的理由
    使用XAML和SharpMap渲染一幅地图
    《Excel与VBA程序设计》最新消息,预计9月上市
    基于Flash的全球卫星照片在线服务
    javascript运算符重载的实现
    uml各类图
  • 原文地址:https://www.cnblogs.com/xjbBill/p/8600793.html
Copyright © 2011-2022 走看看